合并k个排序链表 二分
合并k个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:https://leetcode-cn.com/problems/merge-k-sorted-lists/
题解
- 设置合并两个链表的函数,比较结点大小,保留结点值小的,将剩余部分重新合并接到保留节点后面
- 将链表数组lists进行二分,两两合并
时间复杂度:合并两个链表复杂度O(n),链表数组二分O(logn),总O(nlogn)
//合并两个链表
function mergeTwo(x, y) {
if (!x || !y) return x ? x : y;
if (x.val < y.val) {
//确定了x结点位置,合并后面的结点
x.next = mergeTwo(x.next, y);
return x;
} else {
y.next = mergeTwo(x, y.next);
return y;
}
}
var mergeKLists = function (lists) {
/* 进行二分,自下而上两两合并 */
function mergeList(x, y) {
if (x > y) return null;
if (x == y) return lists[x];
/* 二分 */
let m = Math.floor(x + y >> 1);
let left = mergeList(x, m);
let right = mergeList(m + 1, y);
return mergeTwo(left, right);
}
return mergeList(0, lists.length - 1);
};