[leetcode]Merge k Sorted Lists

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aFeiOnePiece/article/details/47730029
解题思路1:
1,用最小堆,size为lists的长度,Comparator定义为listNode.val
2,初始化把k个list的非空head都放进堆里
3,创建dummyhead用来引导这一切

空间复杂度 O( k ) 
假设有 k个链表,每个链表有n个元素,最小堆调整需要logk,要遍历所有nk个元素。
所以 时间复杂度为 O ( nk log(k) ) 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {

    private static final Comparator<ListNode> listComparator = 
            new Comparator<ListNode>(){
                @Override
                public int compare(ListNode x, ListNode y){
                    return x.val - y.val;
                }
            };
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length == 0) return null;
        // 如果lists.length 为0,初始化PriorityQueue会报错,所以要先来了边界检测
        Queue<ListNode> queue = new PriorityQueue<>(lists.length, listComparator);
        for (int i = 0; i < lists.length; ++i){
            if(lists[i] != null) queue.add(lists[i]);
        }
        ListNode dummyHead = new ListNode(0);
        ListNode p = dummyHead;

        while(!queue.isEmpty()){
            p.next = queue.poll();
            p = p.next;
            if (p.next != null) queue.add(p.next);
        }

        return dummyHead.next;
    }
}

解题思路2:
1,分治,我们知道合并两个 sorted linked list的方法,那么把k个两两合并,分而治之,也比暴力法好很多。
2,再加上对数组的smart的操作。

空间复杂度为 O( 1 )
时间复杂度 合并为logK,再加上遍历了所有的node,最后也是 O(nk log(k) ) 
public class Solution {

    public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length == 0) return null;

        int end = lists.length-1;
        int begin = 0;
        while( end != 0){
            begin = 0;
            while ( begin < end ){
                lists[begin] = merge2Lists(lists[begin], lists[end]);

                begin ++;
                end --;
            }
        }

        return lists[0];
    }

    private ListNode merge2Lists(ListNode l1, ListNode l2){
        ListNode dummy = new ListNode(0);
        ListNode p = dummy;
        while(l1 != null && l2 != null){
            if (l1.val < l2.val){
                p.next = l1;
                l1 = l1.next;
            }else{
                p.next = l2;
                l2 = l2.next;
            }
            p = p.next;
        }
        if (l1 != null) p.next = l1;
        if (l2 != null) p.next = l2;

        return dummy.next;
    }
}





猜你喜欢

转载自blog.csdn.net/aFeiOnePiece/article/details/47730029