为了账号安全,请及时绑定邮箱和手机立即绑定

我有一个关于这个链表合并代码如何工作的快速问题

我有一个关于这个链表合并代码如何工作的快速问题

沧海一幻觉 2023-06-09 17:20:26
我对 head.next 如何返回整个列表而不是下一个值感到困惑,例如下面的代码中的 l1,l2,dummy .next。特别是我想知道 head.next 如何返回整个排序数组并跳过在第二行输入的 -1 值。let mergeTwoLists = function (l1, l2) {  let dummy = new ListNode(-1);  let head = dummy;  while (l1 !== null && l2 !== null) {    if (l1.val <= l2.val) {      dummy.next = l1;      l1 = l1.next;    } else {      dummy.next = l2;      l2 = l2.next;    }    dummy = dummy.next;  }  if (l1 !== null) {    dummy.next = l1;  } else {    dummy.next = l2;  }  return head.next;};class ListNode {  constructor(val = null, next = null) {    this.val = val;    this.next = next;  }}
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

可视化列表的构建方式可能会有所帮助:


让输入是一个列表,其中包含值 [3, 9] 和另一个只有 [4] 的列表:


 l1

 ↓

 3 → 9 → null


 l2

 ↓

 4 → null

在循环开始之前创建一个新节点:


head

 ↓

-1

 ↑

dummy

循环将进行第一次迭代,并且if条件为真。首先dummmy.next是适配,导致出现这种情况:


head l1

 ↓   ↓

-1 → 3 → 9 → null

 ↑

dummy    


 l2

 ↓

 4 → null

...然后l1重新分配一个新的参考:


head     l1

 ↓       ↓

-1 → 3 → 9 → null

 ↑

dummy    


 l2

 ↓

 4 → null

循环中的最后一条语句为 分配了一个新引用dummy:


head     l1

 ↓       ↓

-1 → 3 → 9 → null

     ↑

    dummy    


 l2

 ↓

 4 → null

循环第二次迭代,if现在条件为假,所以我们进入else代码块。Firstdummmy.next被改编(这打破了它与 的链接l1,所以我移动了l1和的可视化l2):


head     l2

 ↓       ↓

-1 → 3 → 4 → null

     ↑

    dummy    


 l1

 ↓

 9 → null

...然后l1重新分配一个新的引用,在这种情况下它变成null:


head          l2

 ↓            ↓

-1 → 3 → 4 → null

     ↑

    dummy    


 l1

 ↓

 9 → null

循环中的最后一条语句为 分配了一个新引用dummy:


head          l2

 ↓            ↓

-1 → 3 → 4 → null

         ↑

        dummy    


 l1

 ↓

 9 → null

在此阶段,循环条件不再为真 ( l2is null),因此if执行循环后面的块。这dummy.next与其余(不是null)参考链接。同样,为了可视化,我交换了l1和的位置l2:


head         l1

 ↓           ↓

-1 → 3 → 4 → 9 → null

         ↑

        dummy    


 l2

 ↓

null

现在我们到了最后的声明:return head.next。请注意headdid 从未离开在开始时创建的新节点。


所以返回的引用是:


head         l1

 ↓           ↓

-1 → 3 → 4 → 9 → null

     ↑

    returned    


 l2

 ↓

null

注意head在这个函数的整个执行过程中如何一直指向带有 -1 的节点。head值为 -1 的临时节点将被垃圾回收,因为一旦函数返回(是局部变量) ,就没有变量再引用它。


查看完整回答
反对 回复 2023-06-09
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号