zoukankan      html  css  js  c++  java
  • 合并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);
    };
    
  • 相关阅读:
    UVA 11198 Dancing Digits
    UVA 10085 The most distant state
    UVA 321 The New Villa
    UVA 10422 Knights in FEN
    poj2876
    poj2895
    poj2914
    poj2892
    poj2941
    LD SDK LDCControlDll 中 CXMLFile的进一步使用方法,建议以后改进
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/12990184.html
Copyright © 2011-2022 走看看