返回
庖丁解算法---LeetCode: 21. 合并两个有序链表
前端
2023-11-01 06:42:45
**庖丁解算法---LeetCode: 21. 合并两个有序链表**
**前言**
各位好,欢迎来到我的算法解题之旅。今天,我们迎来了精彩的第 8 天,我将带着大家一起挑战 LeetCode 上的 21. 合并两个有序链表算法问题。相信通过今天的学习,大家会对链表这一数据结构有更深入的了解,并掌握合并有序链表的技巧。
**算法思路**
21. 合并两个有序链表算法问题如下:
给你两个按非递减顺序排列的链表,返回合并后的链表。
现在,让我们一步步拆解算法的思路:
1. **初始化两个指针** :分别指向两个链表的头部节点。
2. **比较两个指针指向的节点值** :将较小的节点值添加到结果链表中,并移动相应的指针。
3. **重复步骤 2** :直到两个指针都指向空节点。
4. **处理剩余节点** :如果其中一个链表还有剩余节点,则将其余节点添加到结果链表中。
**实现细节**
```javascript
/**
* 合并两个有序链表
* @param {ListNode} l1 第一个链表
* @param {ListNode} l2 第二个链表
* @return {ListNode} 合并后的链表
*/
const mergeTwoLists = (l1, l2) => {
// 如果其中一个链表为空,则直接返回另一个链表
if (l1 === null) {
return l2;
}
if (l2 === null) {
return l1;
}
// 初始化结果链表的头结点
let head = new ListNode();
// 初始化两个指针,分别指向两个链表的头部节点
let p1 = l1;
let p2 = l2;
// 初始化一个指针,指向结果链表的尾结点
let p = head;
// 循环比较两个指针指向的节点值
while (p1 !== null && p2 !== null) {
// 将较小的节点值添加到结果链表中
if (p1.val < p2.val) {
p.next = p1;
p1 = p1.next;
} else {
p.next = p2;
p2 = p2.next;
}
// 移动指针
p = p.next;
}
// 处理剩余节点
if (p1 !== null) {
p.next = p1;
}
if (p2 !== null) {
p.next = p2;
}
// 返回结果链表的头结点
return head.next;
};
示例代码
// 创建两个有序链表
const l1 = new ListNode(1);
l1.next = new ListNode(2);
l1.next.next = new ListNode(4);
const l2 = new ListNode(1);
l2.next = new ListNode(3);
l2.next.next = new ListNode(4);
// 调用合并两个有序链表函数
const mergedList = mergeTwoLists(l1, l2);
// 打印合并后的链表
console.log(mergedList);
输出:
1 -> 1 -> 2 -> 3 -> 4 -> 4
结语
通过今天的学习,我们掌握了如何使用 JavaScript 解决 LeetCode 上的 21. 合并两个有序链表算法问题。希望大家能够举一反三,将算法的思路应用到其他类似的问题中去。我们明天再见!