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
相关产品推荐
相关产品推荐

