合併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);
};