2014年10月2日星期四

[Leetcode] Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
链表合并的加强版,比较简单直观的方法是维护K个链表的头,每次扫描一遍找到最小的然后将其合并到新的链表中,时间复杂度应该为O(nk),空间复杂度为O(1)。可以使用优先级队列来对时间复杂度进行优化,到达O(nlogk),空间复杂度为O(k)。Java的PriorityQueue可以用来实现优先级队列,在构造的时候给定初始的大小(不能小于1)和使用的Comparator即可。注意PriorityQueue不接受null,同时它不是线程安全的,多个线程同时改写数据会导致数据不同步。

public class ListNodeCmp implements Comparator<ListNode> {
	    public int compare(ListNode node1, ListNode node2) {
	        return node1.val - node2.val;
	    }
	}
    public ListNode mergeKLists(List<ListNode> lists) {
        
        PriorityQueue<ListNode> qu = new PriorityQueue<ListNode>(1, new ListNodeCmp());
        ListNode dummy = new ListNode(0);
        for(ListNode node : lists) {
            if(node != null) {
                qu.add(node);
            }
        }
        ListNode temp = dummy;
        while(qu.size() != 0) {
            ListNode mi = qu.poll();
            temp.next = mi;
            temp = temp.next;
            if(mi.next != null) qu.add(mi.next);
        }
        
        return dummy.next;
    }

没有评论:

发表评论