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

LeetCode逆序链表两数相加代码异常:结果缺失中间0求解

问题分析:逆序链表两数相加丢失中间节点

你的代码出现结果缺失中间0的问题,核心原因是没有正确维护结果链表的尾部指针,每次循环都直接覆盖了result.next,导致中间创建的节点被丢弃。

举个具体的例子:
当处理第二个节点(4和6)时,你创建了值为0的节点并赋值给result.next,此时链表是7 -> 0;但处理第三个节点(3和4)时,你又直接把result.next改成了值为8的节点,这就把之前的0节点彻底丢弃了,最终链表变成7 -> 8。

另外你的代码混合了递归和循环的思路,但递归并没有真正发挥作用,反而让逻辑变得混乱,初始的进位处理也可以更严谨。


修正后的代码

我们可以用更清晰的循环逻辑,维护一个跟踪结果链表尾部的指针,同时用哑节点简化头节点的处理:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
        // 哑节点:避免处理头节点为空的特殊情况
        ListNode dummyHead = new ListNode(0);
        // current指针:跟踪结果链表的尾部,确保新节点添加到末尾
        ListNode current = dummyHead;
        int carry = 0;
        
        // 循环条件包含carry!=0:处理两个链表遍历完但仍有进位的情况(比如999+999=1998)
        while (l1 != null || l2 != null || carry != 0) {
            int sum = carry;
            if (l1 != null) {
                sum += l1.val;
                l1 = l1.next;
            }
            if (l2 != null) {
                sum += l2.val;
                l2 = l2.next;
            }
            
            carry = sum / 10;
            // 把新节点添加到结果链表尾部
            current.next = new ListNode(sum % 10);
            // 移动指针到新的尾部
            current = current.next;
        }
        
        // 哑节点的next才是真正的结果头节点
        return dummyHead.next;
    }
}

关键修正点说明

  • 哑节点(dummyHead):不用再单独处理第一个节点的创建逻辑,简化代码结构。
  • current指针:每次创建新节点后,指针会移动到新节点上,确保后续节点始终添加到链表末尾,不会覆盖之前的节点。
  • 包含进位的循环条件:当两个链表都遍历完成但还有进位时(比如999+999),依然能正确生成最后的进位节点。

用你的测试用例执行时,流程会变成:

  1. 计算2+5+0=7,创建7节点,current移动到7;
  2. 计算4+6+0=10,创建0节点,current移动到0;
  3. 计算3+4+1=8,创建8节点,current移动到8;
  4. 循环结束,返回7->0->8,完全符合预期。

内容的提问来源于stack exchange,提问作者Sharif Mamun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:08:35