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

LeetCode链表问题:非DOM环境下如何创建NodeList或转数组为NodeList?

合并两个有序链表的正确链表解法

看来你已经搞清楚这是个链表问题而非数组问题啦,这就找对方向了!LeetCode里的这类链表题目,输入的l1和l2都是数据结构中的链表节点对象,和DOM里的NodeList完全不是一回事,不需要操作DOM来创建。每个链表节点的结构通常是这样定义的:

function ListNode(val, next) {
  this.val = (val === undefined ? 0 : val);
  this.next = (next === undefined ? null : next);
}

你之前的代码是针对数组处理的逻辑,所以返回了数组,但题目要求返回拼接原节点后的链表头节点,我们需要用链表的遍历方式来实现。

下面给你一个直观的迭代式解法,核心逻辑和你想的“合并有序序列”一致,但操作对象是链表节点:

function mergeTwoLists(l1, l2) {
  // 创建一个哑节点,用来简化链表头的处理(最后不会返回它)
  const dummy = new ListNode(0);
  let current = dummy;

  // 同时遍历两个有序链表
  while (l1 !== null && l2 !== null) {
    if (l1.val <= l2.val) {
      current.next = l1; // 把较小的节点直接接在结果链表后
      l1 = l1.next; // 移动l1的指针到下一个节点
    } else {
      current.next = l2;
      l2 = l2.next;
    }
    current = current.next; // 移动结果链表的指针
  }

  // 把剩下未遍历完的链表直接拼接上去
  current.next = l1 !== null ? l1 : l2;

  // 返回合并后的链表头节点
  return dummy.next;
}

如何测试这个函数?

如果你想用数组来模拟输入输出,可以写两个辅助函数来转换:

// 把数组转换成链表
function arrayToList(arr) {
  const dummy = new ListNode(0);
  let current = dummy;
  for (const num of arr) {
    current.next = new ListNode(num);
    current = current.next;
  }
  return dummy.next;
}

// 把链表转换成数组,方便查看结果
function listToArray(list) {
  const arr = [];
  let current = list;
  while (current !== null) {
    arr.push(current.val);
    current = current.next;
  }
  return arr;
}

// 测试示例输入
const listOne = arrayToList([1,2,4]);
const listTwo = arrayToList([1,3,4]);
const mergedList = mergeTwoLists(listOne, listTwo);
console.log(listToArray(mergedList)); // 输出 [1,1,2,3,4,4]

这个解法完全符合题目要求:直接拼接原链表的节点(除了用来简化逻辑的哑节点),时间复杂度为O(n+m),空间复杂度为O(1),是高效的标准解法。

内容的提问来源于stack exchange,提问作者Juan Luces

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:47:51