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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:09:19