LeetCode 21题合并两个有序链表:空输入返回结果不符求助
问题修复方案:合并两个有序链表的错误修正
首先看你遇到的核心问题:当输入两个空链表时,你返回了new ListNode(null),但题目要求的空链表是直接返回null,而非一个val为null的节点。再加上代码本身还有其他潜在问题,下面一步步修正:
1. 核心错误:空链表的返回值
题目定义的空链表就是null,不是任何ListNode实例。所以当两个输入链表都为空时,直接返回null即可,无需创建新节点。
2. 遍历链表的逻辑漏洞
原代码的while循环中,当list1或list2已经遍历到null后,仍会尝试访问list1.val或list2.val,这会触发TypeError。正确逻辑是先判断节点是否存在,再取值。
修正后的完整代码
/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} list1 * @param {ListNode} list2 * @return {ListNode} */ var mergeTwoLists = function (list1, list2) { const arr = []; while (list1 || list2) { // 先判断节点是否存在,再取值并移动指针 if (list1) { arr.push(list1.val); list1 = list1.next; } if (list2) { arr.push(list2.val); list2 = list2.next; } } arr.sort((a, b) => a - b); // 用虚拟头节点简化链表构建,避免索引判断 let dummyHead = new ListNode(); let current = dummyHead; arr.forEach(el => { current.next = new ListNode(el); current = current.next; }); // 若arr为空,dummyHead.next就是null,正好匹配空链表要求 return dummyHead.next; };
额外优化说明
- 虚拟头节点(dummyHead)的用法简化了链表构建流程,无需再判断数组索引是否为0。
- 遍历链表时先判断节点存在性,彻底避免了访问null属性的报错。
- 最终返回
dummyHead.next,当输入全为空时自动返回null,完全符合题目要求。
内容的提问来源于stack exchange,提问作者shaneB
相关产品推荐
相关产品推荐

