合并两个有序链表时dummy节点(out)的更新逻辑是什么?
问题原因核心:Python自定义类实例的引用传递特性
你没有直接修改out变量但它的内容发生了变化,本质是因为ListNode是自定义类,它的实例属于可变引用类型,操作过程中temp和out指向了内存中同一个节点对象。
具体执行过程拆解:
- 执行
out = ListNode(-1)时,内存中会创建一个val为-1的ListNode实例,out变量存储的是这个实例的内存地址,而非实例本身的副本。 - 执行
temp = out时,没有生成新的ListNode实例,只是让temp也存储了同一个哨兵节点的内存地址,二者是同一个对象的两个别名:修改temp指向对象的属性,等价于修改out指向对象的属性。 - 循环过程中你操作的是
temp.next属性,本质就是在拼接out对应的哨兵节点的后续链路:- 第一次循环判断两个链表头值都是1,走else分支执行
temp.next = l2,此时out指向的哨兵节点的next就被赋值为l2的第一个值为1的节点,之后执行temp = temp.next,temp会移动到刚接上的1这个节点的位置,out始终停留在哨兵节点的位置没有变化。 - 后续每次循环都是修改当前
temp指向节点的next属性,将l1或l2的节点接入链路,再把temp向后移动一位,整个过程没有修改out本身的指向,但哨兵节点的后续链路已经被逐步拼接完成。
- 第一次循环判断两个链表头值都是1,走else分支执行
- 最后打印
out时,会递归打印从哨兵节点开始的所有后续节点,就是你看到的完整合并链表。
补充说明:你当前的代码漏了剩余节点的拼接逻辑,循环结束后如果l1或l2还有未遍历的节点,需要加一行
temp.next = l1 if l1 else l2才能把剩余部分接入最终链表。
内容的提问来源于stack exchange,提问作者Sharhad Bashar
相关产品推荐
相关产品推荐

