Skip to content

Latest commit

 

History

History
101 lines (83 loc) · 1.63 KB

23. 合并 K 个升序链表.md

File metadata and controls

101 lines (83 loc) · 1.63 KB

23. 合并 K 个升序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

提示:

k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4

思路

两两合并,最后返回

代码

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode[]} lists
 * @return {ListNode}
 */
var mergeKLists = function (lists) {
  if (!lists.length) {
    return new ListNode().next;
  }
  let head = lists[0];
  let len = lists.length;
  for (let i = 1; i < len; i++) {
    head = mergeTwoLists(head, lists[i]);
  }
  return head;
};

function mergeTwoLists(l1, l2) {
  let list = new ListNode(),
    head = list;
  while (l1 && l2) {
    let val;
    if (l1.val <= l2.val) {
      val = l1.val;
      l1 = l1.next;
    } else {
      val = l2.val;
      l2 = l2.next;
    }
    list.next = new ListNode(val);
    list = list.next;
  }
  list.next = l1 || l2;
  return head.next;
}

复杂度分析

时间复杂度 $O(N*N)$

空间复杂度 $O(1)$