LeetCode两数相加Java解法疑问:dummyHead与curr指针逻辑
关于LeetCode《Add Two Numbers》官方Java代码的疑问解答
问题1:为何最终返回dummyHead.next?循环中并未直接给该节点赋值?
dummyHead是一个哑节点(哨兵节点),作用是简化链表的初始化操作——不用单独处理结果链表为空的边界情况,也不用额外记录头节点。
虽然代码里没直接写dummyHead.next = xxx,但第一次进入循环时,curr指向dummyHead,这时候执行curr.next = new ListNode(sum % 10),本质就是给dummyHead.next赋值,把第一个计算出的节点挂到哑节点后面。后续循环里的curr.next操作,都是在往这个链表的尾部追加新节点。
而dummyHead本身只是个占位的空节点(val=0),不属于最终结果链表的一部分,所以最终要返回它的next,也就是真正的结果链表头节点。
问题2:初始时curr指向dummyHead,后续curr的赋值如何作用于dummyHead的链表结构?
这是Java对象引用的特性:curr和dummyHead一开始指向同一个ListNode对象。
- 当执行
curr.next = new ListNode(...)时,修改的是这个共享对象的next属性,也就是dummyHead指向的节点的next被更新了,相当于给结果链表添加了第一个节点; - 之后
curr = curr.next是让curr指向刚创建的新节点,后续再执行curr.next = ...,就是在这个新节点后面继续追加节点,一步步构建出完整的链表; - 整个过程中
dummyHead始终指向最初的哑节点,它的next链着所有新创建的节点,所以整个链表结构会被完整保留下来。
以下是官方提供的Java代码:
class Solution { // Add Two Numbers (Java improved) public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode(0); ListNode curr = dummyHead; int carry = 0; while (l1 != null || l2 != null || carry != 0) { int x = (l1 != null) ? l1.val : 0; int y = (l2 != null) ? l2.val : 0; int sum = carry + x + y; carry = sum / 10; curr.next = new ListNode(sum % 10); curr = curr.next; if (l1 != null) l1 = l1.next; if (l2 != null) l2 = l2.next; } return dummyHead.next; } }
内容的提问来源于stack exchange,提问作者Jacobo Escobar
相关产品推荐
相关产品推荐

