返回 1. 新建一个空链表
2. 初始化
5. 返回合并后的链表
6.
LeetCode 第 21 题:合并两个有序链表——逐行详解 JavaScript 题解
前端
2023-12-24 06:52:53
题目背景
给定两个升序链表 head1
和 head2
,请合并它们并返回一个新的升序链表。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
示例 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
链表的 head
和 tail
由于 curr
链表是空的,我们需要初始化它的 head
和 tail
,以便后续可以将节点添加到链表中。
curr.head = null;
curr.tail = null;
3. 循环遍历两个输入链表
接下来,我们需要循环遍历两个输入链表 head1
和 head2
,并将它们中的节点合并到 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 题目有疑问,欢迎在评论区留言,我会尽力为您解答。