# 合并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
个链表配对并将同一对中的链表合并,重复配对合并操作,直到合并为一个链表。
# 代码实现
/**
* @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
}
}
← 括号生成 两两交换链表中的节点 →