返回

庖丁解算法---LeetCode: 21. 合并两个有序链表

前端




**庖丁解算法---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. 合并两个有序链表算法问题。希望大家能够举一反三,将算法的思路应用到其他类似的问题中去。我们明天再见!