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

基于ListNode的两数相加问题:循环执行两次却仅生成一个节点?

问题原因分析

你遇到的这个问题,核心原因是构建结果链表时,没有正确维护节点间的引用关系,导致第二次循环生成的节点没有被链接到结果链表中,或者两次循环都修改了同一个节点的值。结合你描述的“循环运行两次但仅生成一个节点”的现象,最常见的两种错误场景如下:

场景1:循环中仅修改当前节点的值,未创建新节点

如果你的代码类似下面这样,就会出现该问题:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode l3 = new ListNode(0);
    ListNode current = l3;
    int carry = 0;
    while (l1 != null || l2 != null) {
        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节点的值,未创建新节点
        current.val = sum % 10;
        // 仅在l1/l2还有后续节点时才创建next,第二次循环后l1/l2都为null,不会创建next
        if (l1 != null || l2 != null) {
            current.next = new ListNode(0);
            current = current.next;
        }
    }
    return l3;
}
  • 第一次循环:current指向l3,将其值设为2,因l1和l2还有下一个节点,创建current.next并移动current到该节点。
  • 第二次循环:计算sum仍为2,修改当前current节点的值为2,但此时l1和l2都已为null,不会创建新的next节点。但如果测试时仅检查l3本身而未遍历整个链表,就会误以为只生成了一个节点;或者代码逻辑错误,导致后续节点未被正确保留。

场景2:结果链表的引用未正确维护,新节点未链接到主链表

这是更可能出现的错误场景,代码类似如下:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode l3 = null;
    ListNode current = null;
    int carry = 0;
    while (l1 != null || l2 != null) {
        int sum = carry;
        if (l1 != null) {
            sum += l1.val;
            l1 = l1.next;
        }
        if (l2 != null) {
            sum += l2.val;
            l2 = l2.next;
        }
        carry = sum / 10;
        ListNode newNode = new ListNode(sum % 10);
        if (l3 == null) {
            l3 = newNode;
            current = newNode;
        } else {
            // 错误:未将current的next指向新节点,仅覆盖current引用
            current = newNode;
        }
    }
    return l3;
}
  • 第一次循环:l3被赋值为第一个值为2的节点,current也指向该节点。
  • 第二次循环:创建了第二个值为2的节点,但仅将current指向新节点,未把原current(第一个节点)的next指向新节点。最终l3仍只指向第一个节点,第二个节点成为孤立节点,导致结果链表仅显示一个节点。

关键总结

本质问题是没有正确维护结果链表的节点引用链:要么没有为第二次循环的结果创建新节点并链接到前一个节点,要么创建了新节点但未将其加入主链表的引用链中。循环运行两次说明求和逻辑都执行了,但节点间的链接关系出错,导致最终返回的链表只包含第一个节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:28:30