LeetCode 2.两数相加:迭代构建链表的逻辑困惑求解
链表迭代构建逻辑解析(针对LeetCode 2.两数相加)
你疑惑的核心在于那个初始定义的节点是哑节点(dummy node)——它根本不是用来存有效结果的,只是个「锚点」,用来帮我们轻松拿到最终链表的头节点,避免处理空链表的边界情况。下面一步步拆解这个构建过程:
核心逻辑拆解
初始化阶段
先创建一个空的哑节点(比如dummy = ListNode(0)),再定义一个移动指针current_node,让它一开始指向这个哑节点。同时初始化进位carry = 0。
这里的哑节点就像一根绳子的起点,current_node就是我们手里捏着的绳头,负责往后续接新的绳段(结果节点)。迭代构建阶段
每次循环处理l1、l2的当前节点值,加上进位计算总和:- 算出当前位的数字(
sum % 10)和新的进位(sum // 10) - 创建一个新节点存当前位的数字
- 把
current_node.next指向这个新节点——相当于在当前绳头后面接了一段新绳 - 把
current_node移动到这个新节点上——现在手里的绳头变成了刚接上的这段,下次就从这里继续接
- 算出当前位的数字(
最终返回
循环结束后,哑节点的next指向的就是结果链表的第一个有效节点,直接返回dummy.next就行。
用示例走一遍流程(l1=[2,4,3], l2=[5,6,4])
- 初始状态:
dummy -> None,current_node = dummy - 第一次循环:2+5+0=7,进位0。创建节点7,
current_node.next = 7,current_node移到7。此时链表:dummy -> 7 - 第二次循环:4+6+0=10,当前位0,进位1。创建节点0,
current_node.next = 0,current_node移到0。此时链表:dummy ->7 ->0 - 第三次循环:3+4+1=8,进位0。创建节点8,
current_node.next =8,current_node移到8。此时链表:dummy ->7 ->0 ->8 - 循环结束,返回
dummy.next,就是7->0->8,完全符合预期。
为什么不会是长度为2的链表?
你误以为长度不够,是把哑节点当成了有效节点。实际上哑节点不算在结果链里,我们每次都是在current_node的后面加新节点,然后current_node跟着往后走,相当于一直在链表的尾部追加新元素,迭代几次就会生成几个有效节点,最终结果链的长度就是迭代次数对应的有效节点数。
内容的提问来源于stack exchange,提问作者ail_straw
相关产品推荐
相关产品推荐

