LeetCode中addTwoNumbers函数运行时错误排查求助
问题情况
我在解决LeetCode的add-two-numbers问题时,采用反转数组转数字相加、再转回反转数组返回的思路,本地运行正常,但提交到LeetCode后抛出运行时错误。
我的代码如下:
var addTwoNumbers = function(l1, l2) { var tempL1 =[] var tempL2 =[] for (var i = l1.length -1; i >= 0; i--) { tempL1.push(l1[i]) } for (var i = l2.length -1; i >= 0; i--) { tempL2.push(l2[i]) } var result = Number(tempL1.join("")) + Number(tempL2.join("")) var array = Array.from(result.toString()) var finalArray = [] for (let i = array.length -1; i >= 0; i--) { finalArray.push(array[i]) } return finalArray };
抛出的错误信息(翻译后):
Line 34 in solution.js
throw new TypeError(serialize(ret) + " is not valid value for the expected return type ListNode");
^
TypeError: ["0"] is not valid value for the expected return type ListNode
Line 34: Char 20 in solution.js (Object.)
Line 16: Char 8 in runner.js (Object.runner)
Line 18: Char 26 in solution.js (Object.)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
错误核心原因
这题的输入输出不是普通数组,而是ListNode链表结构:
- 输入的l1、l2是ListNode实例,没有length属性,你用数组的遍历方式完全错误
- 题目要求返回ListNode类型的链表,而你的代码返回了普通数组,类型不匹配导致报错
另外还有个隐藏问题:如果两个链表代表的数字很大,用Number转换会丢失精度,必须用BigInt处理。
修复后的代码
// 辅助函数:将链表转成BigInt数字 function listToNum(head) { let numStr = ''; while (head) { numStr = head.val + numStr; head = head.next; } return BigInt(numStr); } // 辅助函数:将数字转成逆序链表 function numToList(num) { const numStr = num.toString(); let dummy = new ListNode(0); let current = dummy; // 逆序遍历字符串,构建链表 for (let i = numStr.length - 1; i >= 0; i--) { current.next = new ListNode(Number(numStr[i])); current = current.next; } // 如果结果是0,直接返回单个节点 return dummy.next || new ListNode(0); } var addTwoNumbers = function(l1, l2) { const num1 = listToNum(l1); const num2 = listToNum(l2); const sum = num1 + num2; return numToList(sum); };
说明
- 用
listToNum遍历链表收集节点值,拼接成字符串后转成BigInt,避免大数精度丢失 numToList将相加后的BigInt转成字符串,逆序遍历构建出符合要求的ListNode链表- 完全符合题目对输入输出类型的要求,不会再出现类型不匹配的错误
内容的提问来源于stack exchange,提问作者AbdelrahmanAhmed

