LeetCode两数相加题解:curr重赋值后dummyHead为何仍能更新
LeetCode「两数相加」题解疑问解析
对应题解Python实现
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]: dummyHead = ListNode(0) curr = dummyHead carry = 0 while l1 != None or l2 != None or carry != 0: l1Val = l1.val if l1 else 0 l2Val = l2.val if l2 else 0 columnSum = l1Val + l2Val + carry carry = columnSum // 10 newNode = ListNode(columnSum % 10) curr.next = newNode curr = newNode l1 = l1.next if l1 else None l2 = l2.next if l2 else None return dummyHead.next
问题描述
第一次迭代执行curr = newNode将curr指向新创建的节点对象后,从第二次迭代开始dummyHead对象是如何被更新的?
解答
Python中的对象赋值传递的是内存引用,不是对象的完整拷贝,整个执行流程里dummyHead本身的指向从未发生变化,也不需要被反复更新,逻辑拆解如下:
- 初始化阶段执行
curr = dummyHead时,curr和dummyHead指向内存中同一个值为0的哑节点,没有生成新的独立节点。 - 第一次循环创建第一个结果节点
newNode后,会先执行curr.next = newNode:此时curr还指向初始哑节点,这行代码直接将哑节点的next指针绑定到第一个结果节点上,从这一步开始,dummyHead就已经和整条结果链表的起始位置连在了一起。 - 之后执行
curr = newNode,仅修改curr变量的指向,让它挪到刚创建的第一个结果节点上,dummyHead的指向没有任何变动,始终停留在最开头的哑节点位置。 - 第二次及后续循环中,每次创建新的结果节点后执行
curr.next = newNode,本质是给当前curr指向的、已经串在链表上的节点绑定后继指针,把新节点接在链表尾部,再把curr移动到新的尾节点上。整个拼接过程是顺着链表逐节点向后延伸,dummyHead作为固定的头锚点不需要做任何修改,它从第一次循环绑定第一个结果节点开始,就始终关联着整条结果链表,最后返回dummyHead.next就能拿到完整的结果链表头。
可以用串珠子做直观类比:dummyHead是你固定在桌边的绳头,最开始你手捏着绳头(
curr = dummyHead),穿第一颗珠子时把珠子系在绳头的尾端(curr.next = newNode),之后手移到刚穿好的第一颗珠子上捏着(curr = newNode);穿后续珠子时,只需要把新珠子系在你当前捏着的珠子尾端,再把手移到新珠子上即可。全程桌边的绳头没有移动过位置,但所有穿好的珠子都顺着绳头连成了完整的一串,最后直接取绳头后面串好的整串就是需要的结果。
内容的提问来源于stack exchange,提问作者Sajith raj
相关产品推荐
相关产品推荐

