You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:05:24