【算法解析LeetCode by Javascript】23. 合并K个排序链表
合并K个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6
1.暴力破解法
此解法过于暴力,请谨慎使用
原理就是把所有的节点拆解,排序,再从新组合成一个列表,道理容易理解
时间复杂度为 O(nlogn)
2.枚举法
此解法的主要思路为遍历所有列表的头部值,把最小的一个推入到当前结果队列里

具体解法为
var isOver = function (lists) {
    let r = true
    lists.map(val => {
        if (val) {
            r = false
            return r
        }
    })
    
    return r
}
var minNode = function (lists) {
    let val = null
    let j
    for (var i = 0; i < lists.length; i++) {
        if (lists[i]) {
            if (val === null) {
                val = lists[i].val
            }
            // console.log(lists[i].val, val)
            if (lists[i].val <= val) {
                val = lists[i].val
                j = i
            }
        }
    }
    console.log(j)
    let m = new ListNode(lists[j].val)
    lists[j] = lists[j].next
    
    return m
}
var mergeKLists = function(lists) {
    if (lists.length === 0) return ''
    let result = null
    while (!isOver(lists)) {
        if (!result) {
            result = minNode(lists)
        } else {
            let z = result
            while (z.next) {
              z = z.next
            }
            z.next = minNode(lists)
        }
    }
    
    return result
    
};最极端的情况下我们每次获取元素都需要遍历k个链表,那么复杂度就是O(kn),k值复杂度越高。不一定比方法-更快
3.分治法
我们只需要把相邻列表进行合并,这样的话我们只需要进行logN次操作就可以把列表归并成一个有序列表

递归深度一共是logk,每一层的递归操作次数都是n次,n是所有元素的个数。那么总的复杂度就是
O(nlogk)
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode[]} lists
 * @return {ListNode}
 */
var mergeKLists = function(lists) {
    if(lists.length == 0) return null;
    var k = lists.length;
    while(k > 1){
        for (let i = 0; i < ~~(k / 2); i++) {
            lists[i] = mergeTwoLists(lists[i], lists[i + ~~((k + 1) / 2)]);
        }
        k = ~~((k + 1) / 2);
    }
    return lists[0];
};
var mergeTwoLists = function (l1, l2) {
    if (l1 == null) return l2
    if (l2 == null) return l1
    if (l1.val <= l2.val) {
        l1.next = mergeTwoLists(l1.next, l2)
        return l1
    } else {
        l2.next = mergeTwoLists(l1, l2.next)
        return l2
    }
}提交

相关推荐
  earthhouge    2020-08-15  
   dbhllnr    2020-06-04  
   koushr    2020-11-12  
   范范    2020-10-28  
   zhaochen00    2020-10-13  
   Mars的自语    2020-09-27  
   steeven    2020-09-18  
   kka    2020-09-14  
   qiangde    2020-09-13  
   聚沙成塔积水成渊    2020-08-16  
   aanndd    2020-08-12  
   范范    2020-07-30  
   bluetears    2020-07-28  
   mingyunxiaohai    2020-07-19  
   horizonheart    2020-07-19  
   liushall    2020-07-18  
   bluetears    2020-07-05  
   fengshantao    2020-07-02  
   liuweixiao0    2020-06-27