关于合并链表merge函数while循环中L1!==null的检查逻辑疑问
关于合并链表merge函数中while循环条件的解析
嘿,我来帮你把这个问题讲清楚~
首先先贴出你提供的代码方便对照:
function merge(L1, L2) { var L3 = new Node(null, null); var prev = L3; while (L1 !== null && L2 !== null) { if (L1.data <= L2.data) { prev.next = L1; L1 = L1.next; } else { prev.next = L2; L2 = L2.next; } prev = prev.next; } if (L1 === null) { prev.next = L2; } if (L2 === null) { prev.next = L1; } return L3.next; }
核心结论
L1 !== null检查的是「当前L1指向的节点是否存在」——也就是链表L1还有未处理的剩余节点,既不是检查节点的data有没有值,也不是笼统地检查“L1是否为有效链表”。
详细拆解原因
1. 先理解链表的节点结构
这段代码里的Node是一个包含两个属性的结构:
data:存储当前节点的数值next:指向下一个节点的引用(指针)
当链表走到最后一个节点时,它的next会被设为null,表示链表到此结束。而L1本身是一个指向链表节点的引用——你可以把它看成一个“移动的指针”,跟着遍历进度在链表上往前走。
2. while循环的逻辑意义
循环条件L1 !== null && L2 !== null的作用是:只有当两个链表都还有未处理的节点时,才继续执行节点比较和拼接操作。
- 每次循环中,我们比较当前L1和L2节点的
data值,把较小的那个节点接到结果链表L3的末尾,然后把对应的指针(L1或L2)往后移动一位(比如L1 = L1.next,就是让L1指向当前节点的下一个节点)。 - 当其中一个链表的指针变成
null时,说明这个链表已经遍历完所有节点了,循环就会停止——因为此时只剩下另一个链表的剩余节点,直接把它整个拼接到L3的末尾就行(这就是后面两个if语句的作用)。
3. 和“检查节点data有值”的区别
哪怕某个节点的data是null(比如代码里初始化L3用的new Node(null, null)),只要这个节点本身存在(L1指向它,而不是null),L1 !== null就会返回true。举个例子:如果L1是一个data为null的节点,L1 !== null是成立的,但L1.data是null——这是完全不同的两个检查逻辑。
4. 和“检查L1是否为有效链表”的区别
如果L1一开始就是null(表示这是一个空链表),那循环根本不会执行,代码会直接进入后面的if语句,把L2整个接到L3上。所以L1 !== null不是检查整个链表是否有效,而是检查当前遍历的位置是否还有节点可以处理。
举个简单例子帮助理解
假设L1是1 -> 3 -> null,L2是2 -> 4 -> null:
- 初始时L1指向1节点,L2指向2节点,都不为
null,进入循环,把1接到L3,L1移动到3节点。 - 接着L1指向3,L2指向2,都不为
null,把2接到L3,L2移动到4节点。 - 然后L1指向3,L2指向4,都不为
null,把3接到L3,L1移动到null(因为3是L1的最后一个节点,它的next是null)。 - 现在L1是
null,循环停止,代码把L2剩下的4 -> null接到L3末尾,最终L3就是1 -> 2 -> 3 -> 4 -> null。
这样是不是就彻底明白这个条件的作用啦?
内容的提问来源于stack exchange,提问作者user7572137
相关产品推荐
相关产品推荐

