You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于合并链表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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:44:36