LeetCode两数相加(Add Two Numbers)用例3调试求助
Add Two Numbers 代码错误分析与修复
问题诊断
你的代码存在三个关键错误,导致输出不符合预期:
链表指针移动逻辑错误
原代码中移动l1和l2的逻辑:if (l1 != null && l1.next != null) { l1 = l1.next; } else l1 = null;该逻辑错误地将最后一个节点直接置为
null,而非移动到next指针(即使next为null),导致后续循环中节点处理不完整,进位逻辑混乱。重复处理进位
循环内部额外添加的进位判断完全多余:if (l1 == null && l2 == null && carry != 0) { current.next = new ListNode(carry, current.next); }你的循环条件已经包含
carry != 0,当l1、l2都为空但进位存在时,循环会自动执行一次处理进位,这段代码会导致进位被重复添加,产生多余节点。新节点创建方式错误
原代码使用current.next = new ListNode(remainder, current.next);创建节点,该写法是在current的next位置插入新节点,而非追加到链表末尾,导致节点顺序和结构混乱。
修正后的代码
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { * this.val = val; * } * ListNode(int val, ListNode next) { * this.val = val; * this.next = next; * } * } */ class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode answer = new ListNode(); ListNode current = answer; int carry = 0; while(l1 != null || l2 != null || carry != 0) { int l1_value = l1 != null ? l1.val : 0; int l2_value = l2 != null ? l2.val : 0; int total = l1_value + l2_value + carry; int remainder = total % 10; carry = total / 10; // 正确创建节点并追加到链表末尾 current.next = new ListNode(remainder); current = current.next; // 正确移动链表指针 if(l1 != null) { l1 = l1.next; } if(l2 != null) { l2 = l2.next; } } return answer.next; } }
验证说明
针对测试用例l1 = [9,9,9,9,9,9,9],l2 = [9,9,9,9],修正后的代码会按位计算和与进位:
- 前四位相加均产生进位1,依次得到余8、9、9、9;
- 后续处理
l1剩余的三个9,加上进位1后依次得到余0、0、0,进位1; - 最后处理剩余进位1,添加节点1;
最终输出为[8,9,9,9,0,0,0,1],符合预期。
内容的提问来源于stack exchange,提问作者Kosumi
相关产品推荐
相关产品推荐

