Skip to content

1. 合并有序链表

LeetCode 第 21 题合并两个有序链表

题目

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

Alt text


输入l1 = [1,2,4], l2 = [1,3,4]

输出:[1,1,2,3,4,4]

示例 2

输入l1 = [], l2 = []

输出:[]

示例 3:

输入l1 = [], l2 = [0]

输出:[0]

提示:两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序排列

题目解析

两个链表都是有序的,那么只需要一次比较表头的数据,较小的赋值到新链表上,然后 next,较大的不动即可

js

/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function (list1, list2) {
  // 迭代指针
  let p1 = list1;
  let p2 = list2;
  // 新节点设置虚拟头节点
  let newList = {
    value: null,
    next: null,
  };
  // 新链表迭代指针
  let p3 = newList;
  // 如果两个链表都存在,开始迭代
  while (p1 && p2) {
    // 比较两个链表的值,取较小的值迭代,大的值不动
    if (p1.val < p2.val) {
      p3.next = p1;
      p1 = p1.next;
    } else {
      p3.next = p2;
      p2 = p2.next;
    }
    // 新链表向前迭代
    p3 = p3.next;
  }
  // 如果list 还剩余节点,那么 list2 不会有剩余,拼接剩余节点到后面即可
  if (p1) {
    p3.next = p1;
  }
  // 同上
  if (p2) {
    p3.next = p2;
  }
  // 返回新链表的头节点
  return newList.next;
};