合併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);
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章