LeetCode23. 合并K个升序链表

 

方法1:使用优先队列合并

方法2:分治法,两两合并

 

代码1:优先队列

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        /**
         *  方法1:使用优先队列
         *      把链表的头结点都放进去,然后出队当前优先队列中最小的,接上链表,,
         *      然后让出队的那个节点的下一个入队,再出队当前优先队列中最小的,直到优先队列为空。
         *      注意:优先队列中不能出现 null,要对 null 进行判断
         */
        if (lists == null || lists.length == 0) return null;
        ListNode dummyHead = new ListNode(-1);
        ListNode cur = dummyHead;
        PriorityQueue<ListNode> minHeap = new PriorityQueue<>((o1, o2) -> o1.val - o2.val);
        for (ListNode head : lists) {
            if (head != null) { // 注意
                minHeap.add(head);
            }
        }
        while (!minHeap.isEmpty()) {
            ListNode temp = minHeap.poll();
            if (temp.next != null) {  // 注意,如果某个链表遍历完了
                minHeap.add(temp.next);
            }
            cur.next = temp;
            cur = cur.next;
        }
        return dummyHead.next;
    }
}

 

代码2:分治法

M

 

posted @ 2020-12-20 18:41  不学无墅_NKer  阅读(69)  评论(0编辑  收藏  举报