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),依然能正确生成最后的进位节点。
用你的测试用例执行时,流程会变成:
- 计算2+5+0=7,创建7节点,current移动到7;
- 计算4+6+0=10,创建0节点,current移动到0;
- 计算3+4+1=8,创建8节点,current移动到8;
- 循环结束,返回
7->0->8,完全符合预期。
内容的提问来源于stack exchange,提问作者Sharif Mamun
相关产品推荐
相关产品推荐

