返回

LeetCode 第 21 题:合并两个有序链表——逐行详解 JavaScript 题解

前端

题目背景

给定两个升序链表 head1head2,请合并它们并返回一个新的升序链表。新链表是通过拼接给定的两个链表的所有节点组成的。

示例

示例 1:

输入:head1 = [1,2,4], head2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:head1 = [], head2 = []
输出:[]

示例 3:

输入:head1 = [], head2 = [0]
输出:[0]

算法解析

1. 新建一个空链表 curr

首先,我们需要新建一个空链表 curr,它将作为最终合并后的链表。这个链表将存储合并后的所有节点。

let curr = new ListNode();

2. 初始化 curr 链表的 headtail

由于 curr 链表是空的,我们需要初始化它的 headtail,以便后续可以将节点添加到链表中。

curr.head = null;
curr.tail = null;

3. 循环遍历两个输入链表

接下来,我们需要循环遍历两个输入链表 head1head2,并将它们中的节点合并到 curr 链表中。

while (head1 !== null && head2 !== null) {
  // 比较两个链表当前节点的值
  if (head1.val < head2.val) {
    // 将 head1 的当前节点添加到 curr 链表中
    addToCurr(head1.val);
    // 移动 head1 到下一个节点
    head1 = head1.next;
  } else {
    // 将 head2 的当前节点添加到 curr 链表中
    addToCurr(head2.val);
    // 移动 head2 到下一个节点
    head2 = head2.next;
  }
}

4. 处理剩余节点

当其中一个链表遍历完成后,另一个链表中可能还剩下一些节点。我们需要将这些剩余节点添加到 curr 链表中。

// 将 head1 的剩余节点添加到 curr 链表中
while (head1 !== null) {
  addToCurr(head1.val);
  head1 = head1.next;
}

// 将 head2 的剩余节点添加到 curr 链表中
while (head2 !== null) {
  addToCurr(head2.val);
  head2 = head2.next;
}

5. 返回合并后的链表 curr

最后,我们将合并后的链表 curr 返回作为函数的返回值。

return curr;

6. addToCurr 函数

addToCurr 函数用于将一个节点添加到 curr 链表中。

function addToCurr(val) {
  // 创建一个新的节点
  let node = new ListNode(val);

  // 如果 curr 链表为空,则将新节点设置为 head tail
  if (curr.head === null) {
    curr.head = node;
    curr.tail = node;
  } else {
    // 将新节点添加到 curr 链表的尾部
    curr.tail.next = node;
    curr.tail = node;
  }
}

总结

以上就是 LeetCode 第 21 题「合并两个有序链表」的 JavaScript 题解。我们使用逐行注释的方式,详细解释了算法的实现过程,希望能对您理解该算法有所帮助。

如果您对本题或其他 LeetCode 题目有疑问,欢迎在评论区留言,我会尽力为您解答。