把k个有序链表merge成一个有序的链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
使用优先队列,先把所有不为空的链表头放到优先队列中,然后将最大的一个poll()出来,如果这个最大的节点再原链表中有下一个节点那么把它的下一个节点放到优先队列中继续比较。
这样可以保证在当前为放到最终有序的大链表中的最大节点一定是在优先队列中、
注意优先队列的实现
比较器的实现
以及复杂度
里insert和deleteMin操作复杂度都是O(logk),k是lists.length
Time Complexity - O(nlogk), Space Complexity - O(k), 这里k为lists的长度, n为所有的节点数
比较器的实现:1.2 return 1-2 就是由大到小排 return 2-1就是由小到大排
public class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode dummy=new ListNode(-1);
ListNode node=dummy;
PriorityQueue<ListNode> pq=new PriorityQueue<ListNode>(new Comparator<ListNode>(){
public int compare(ListNode l1,ListNode l2){
return l1.val-l2.val;
}
});
for(ListNode head:lists){
if(head!=null){
pq.offer(head);
}
}
while(pq.size()>0){
node.next=pq.poll();
node=node.next;
if(node.next!=null){
pq.offer(node.next);
}
}
return dummy.next;
}
}