23. Merge k Sorted Lists

因为snapchat有一道题,merge log

“用电脑写一个program,可以把多个log file合并成一个,按照每个log的时间顺序排,要能运行。这不就是都读进来然后排个序然后输出吗!然后我用了大量的时间。。。搜索如何用c++进行file io。。。太丢人了。主要网速太慢!写完了给他看,能运行。OK。然后他问如何改进。我突然想到这些log file是排好序的,就说可以merge sort的方法merge进来,每个文件保持一个pointer就行。后来他问如果有很多log file呢,min heap完事儿。

from http://www.1point3acres.com/bbs/thread-156483-1-1.html


其实就是merge k sorted lists吧

使用一个PriorityQueue,每次抽出最小的点,维持每个list的头

 

 1     public ListNode mergeKLists(ListNode[] lists) {
 2         if(lists.length == 0) {
 3             return null;
 4         }
 5         ListNode dummy = new ListNode(-1);
 6         ListNode head = dummy;
 7         PriorityQueue<ListNode> pq = new PriorityQueue<>(new Comparator<ListNode>() {
 8             public int compare(ListNode l1, ListNode l2) {
 9                 return l1.val - l2.val;
10             }
11         });
12         for(int i = 0; i < lists.length; i++) {
13             if(lists[i] != null) {
14                 pq.offer(lists[i]);
15             }
16         }
17         while(!pq.isEmpty()) {
18             head.next = pq.poll();;
19             head = head.next;
20             if(head.next != null) {
21                 pq.offer(head.next);
22             }
23         }
24         return dummy.next;
25     }

 

posted @ 2016-10-11 04:51  warmland  阅读(147)  评论(0编辑  收藏  举报