LeetCode《Add Two Numbers》报错l1.reverse is not a function求助
解决LeetCode Add Two Numbers中
l1.reverse is not a function错误 错误根源
你本地测试时用的是数组,但LeetCode平台实际传入的l1和l2不是JS原生数组,而是题目定义的链表节点对象。链表节点的结构大概是这样:
function ListNode(val, next) { this.val = (val === undefined ? 0 : val) this.next = (next === undefined ? null : next) }
链表节点没有reverse()方法,所以调用时会直接报错。
另外你的代码还有个隐藏问题:如果输入的数字极大(超出JS整数精度范围2^53),parseInt会丢失精度,导致测试用例失败。
正确解法:链表遍历模拟加法
按照链表的特性,逐位相加并处理进位,才是符合题目要求的解法:
var addTwoNumbers = function(l1, l2) { // 虚拟头节点,简化结果链表的构建 const dummyHead = new ListNode(0); let current = dummyHead; let carry = 0; // 进位值 // 遍历两个链表,直到所有节点处理完且无进位 while (l1 !== null || l2 !== null || carry !== 0) { const val1 = l1 ? l1.val : 0; const val2 = l2 ? l2.val : 0; const sum = val1 + val2 + carry; carry = Math.floor(sum / 10); // 更新进位 current.next = new ListNode(sum % 10); // 当前位的结果 // 移动指针 current = current.next; if (l1) l1 = l1.next; if (l2) l2 = l2.next; } return dummyHead.next; // 跳过虚拟头节点,返回实际结果链表 };
解法说明
- 虚拟头节点
dummyHead:避免单独处理结果链表头节点为空的边界情况,直接在它后面追加节点即可 - 进位处理:每次计算当前位和时,加上上一位的进位,再更新新的进位值
- 循环终止条件:必须同时满足两个链表都遍历完毕,且没有剩余进位,否则会漏掉最后一位的进位(比如999+1=1000的情况)
- 时间复杂度O(max(m,n)),m、n为两个链表的长度,空间复杂度O(max(m,n)),用于存储结果链表
内容的提问来源于stack exchange,提问作者bardala
相关产品推荐
相关产品推荐

