Java实现逆序存储链表两数相加算法时测试用例不通过问题排查
错误原因分析
1. 核心问题:数值类型溢出
你的代码思路是把链表转成字符串反转后转long相加,但是Java中long是64位有符号整数,最大只能存储9223372036854775807(约9e18,对应19位十进制数),题目没有限制链表长度,一旦链表代表的数值超过long的存储范围,Long.parseLong要么抛出异常,要么得到错误的溢出值,你当前测试用例输出首位为8就是溢出导致的计算错误。
2. 其他不合理写法
- 字符串拼接、反转、类型转换的操作冗余,时间和空间消耗都高于直接遍历链表相加的实现
- 边界场景兼容性差:比如两个输入都是
[0]的情况,虽然你当前代码碰巧能返回正确结果,但整体逻辑没有主动兼容这类特殊场景
正确实现思路
不需要转换为数值,直接同时遍历两个链表,逐位相加,维护进位值即可,步骤如下:
- 初始化虚拟头节点、当前指针、进位变量为0
- 只要两个链表有一个没遍历完,或者还有进位没处理,就继续循环:
- 取当前两个链表节点的值(节点为空则取0)
- 计算当前位总和=两个值相加+进位
- 当前位存储值=总和%10,新的进位=总和/10
- 新建节点存储当前位值,移动当前指针
- 最后返回虚拟头节点的下一个节点即可
修正后代码
class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(0); ListNode cur = dummy; int carry = 0; while (l1 != null || l2 != null || carry != 0) { int x = l1 == null ? 0 : l1.val; int y = l2 == null ? 0 : l2.val; int sum = x + y + carry; carry = sum / 10; cur.next = new ListNode(sum % 10); cur = cur.next; if (l1 != null) l1 = l1.next; if (l2 != null) l2 = l2.next; } return dummy.next; } }
内容的提问来源于stack exchange,提问作者MathCurious
相关产品推荐
相关产品推荐

