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

LeetCode Add Two Numbers问题:最终进位节点未添加至链表末尾

问题分析

你的问题出在处理最终进位的逻辑上:循环结束后,l1已经指向了原链表末尾的nullptr,此时你新建节点并赋值给l1,只是改变了l1这个局部指针的指向,并没有把新节点连接到原链表的最后一个有效节点上,所以这个新节点无法被包含在返回的链表中。

修复方案

需要在遍历过程中跟踪链表的尾节点,当最后有进位时,把新节点挂载到尾节点的next上。具体修改如下:

修改后的代码

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int carry = 0;
        ListNode* ans = l1;
        ListNode* tail = nullptr; // 新增尾节点指针
        while(l1 || l2){
            if(l1 == nullptr) l1 = new ListNode();
            if(l2 == nullptr && l1){
                int tempL1Val = l1 -> val;
                l1 -> val = (l1 -> val + carry) % 10;
                carry = (carry + tempL1Val) / 10;
            }else if(l1 != nullptr && l2 != nullptr){
                int tempL1Val = l1 -> val;
                l1 -> val = (l1 -> val + l2 -> val + carry) % 10;
                carry = (tempL1Val + l2 -> val + carry) / 10;
                l2 = l2 -> next;
            }
            tail = l1; // 记录当前节点为尾节点
            l1 = l1 -> next;
        }
        
        if(carry){
            tail->next = new ListNode(carry); // 将进位节点挂载到尾节点后
        } 
        return ans;
    }
};

关键修改点

  • 新增tail指针,在每次处理完当前节点后,将其指向当前的l1节点,确保始终跟踪链表的最后一个有效节点。
  • 处理进位时,不再直接给l1赋值新节点,而是将新节点赋值给tail->next,这样就把新节点连接到了原链表的末尾。
  • 精简了原代码中冗余的判断(原代码中if(l1 == nullptr)之后又判断l1 == nullptr && l2,此时l1已经被创建为新节点,这个判断永远不会成立,所以直接删除)。
测试验证

针对你提供的失败测试用例:

  • 输入:l1 = [9,9,9,9,9,9,9],l2 = [9,9,9,9]
  • 修改后的代码会在处理完所有节点后,将进位1的节点挂载到原链表的最后一个节点0的后面,最终输出[8,9,9,9,0,0,0,1],符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:30:13