LeetCode 23: Merge k Sorted Lists

来源:互联网 发布:淘宝上买东西不花钱 编辑:程序博客网 时间:2024/06/03 20:16

原题链接在此:https://leetcode.com/problems/merge-k-sorted-lists/#/description

这题是合并2个排序链表的扩展版。最容易想到的方法:为每个链表维护一个当前指针,每次对这k个指针指向的节点比较取最小节点,然后步进1次,这样时间复杂度是O(n * k * k)。

更好的办法是:在比较这里做优化,使用一个优先级队列存这k个节点,每次取最小节点时间为O(1),新节点入队列维护的时间为O(logk),这样时间复杂度降低到O(n * k * logk)。

    public ListNode mergeKLists(ListNode[] lists) {        PriorityQueue<ListNode> heap = new PriorityQueue<ListNode>(10, new Comparator<ListNode>(){            @Override            public int compare(ListNode o1, ListNode o2) {                return o1.val - o2.val;            }        });        for (ListNode n : lists) {            if (n != null)                heap.add(n);        }        ListNode head = null;        ListNode prev = null;        while (!heap.isEmpty()) {            ListNode c = heap.poll();            if (head == null) {                head = c;                prev = c;            }            else {                prev.next = c;                prev = c;            }            ListNode next = c.next;            if (next != null)                heap.add(next);        }        return head;    }