合并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);
};
posted @ 2020-05-05 13:02  aeipyuan  阅读(126)  评论(0编辑  收藏  举报