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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:45:01