# 合并K个升序链表

力扣🔗:https://leetcode-cn.com/problems/merge-k-sorted-lists (opens new window)

# 题目

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

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

示例 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

# 解题思路

  • 采用分治合并的思想,沿用合并两个有序链表的解法,将 k 个链表配对并将同一对中的链表合并,重复配对合并操作,直到合并为一个链表。

MergeKSortedLists

# 代码实现

/**
 * @param {ListNode[]} lists
 * @return {ListNode}
 */
function mergeKLists(lists) {
  return merge(lists, 0, lists.length - 1)

  function merge(lists, l, r) {
    if (l == r) return lists[l] // 到达合并点

    if (l > r) return null // 如果传入空数组

    const mid = (l + r) >> 1 // 取中位数
    return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r))
  }

  function mergeTwoLists(l1, l2) {
    const result = new ListNode()
    let temp = result

    while (l1 && l2) {
      if (l1.val === l2.val) {
        // 两个节点值相等
        temp.next = new ListNode(l1.val, new ListNode(l1.val))
        temp = temp.next // 跳到下个节点

        // 同时向后移动
        l1 = l1.next
        l2 = l2.next
      } else if (l1.val > l2.val) {
        // 当前节点值较小的链表向后移动
        temp.next = new ListNode(l2.val)
        l2 = l2.next
      } else {
        temp.next = new ListNode(l1.val)
        l1 = l1.next
      }

      temp = temp.next || new ListNode() // 更新到下一个节点
    }

    temp.next = l1 || l2 // 如果有剩余节点,则添加
    return result.next
  }
}