[路飞]_23.合并K个生序链表

164 阅读1分钟

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

LeetCode23.合并K个生序链表

题目要求

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:[  1->4->5,  1->3->4,  2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6
思路1.暴力破解
  • 把lists里面每个节点的值合并成一个数组

  • 再把合并的数组进行排序

  • 最后把这个数组以链表的形式返回

    var mergeKLists = function (lists) {
    // 把节点的值合并成一个数组
    let arr = [];
    for (let i = 0; i < lists.length; i++) {
    while (lists[i]) {
    arr.push(lists[i].val);
    lists[i] = lists[i].next;
    }
    }
    // 数组排序
    arr.sort((a, b) => a - b);
    //以节点的形式返回链表
    let dummy = new ListNode(0);
    let cur = dummy;
    for (let i = 0; i < arr.length; i++) {
    cur.next = new ListNode(arr[i]);
    cur = cur.next;
    }
    return dummy.next; };

思路2.分治排序
  • 先找到一个中间的值,把这个数组分为两部分

  • 再把两部分分成两部分不断递归,直到无法再进行递归的时候

  • 最后是合并两个链表

var mergeKLists = function(lists) {    
    return merge(lists, 0, lists.length - 1);    

    // 不断的进行分组    
    function merge(lists, begin, end){        
        if (begin == end) return lists[begin];        
        if (begin > end) return null;        
        let mid = (begin + end) >> 1;        
        let l1 = merge(lists, begin, mid);        
        let l2 = merge(lists, mid + 1, end);        
        return mergeTwoLists(l1, l2);    
    } 
   
    // 合并    
    function mergeTwoLists(l1,l2){        
        if (l1 == null || l2 == null) {            
            return l1 != null ? l1 : l2        
    }   

    let dummy = new ListNode(0);        
    let cur = dummy;        
    while (l1 && l2) {            
        if (l1.val < l2.val) {                
            cur.next = l1;                
            l1 = l1.next;            
        } else {                
            cur.next = l2;                
            l2 = l2.next;            
        }            
            cur = cur.next        
    }        
    cur.next = l1 != null ? l1 : l2;        
    return dummy.next;    
    }
};