23.合并k个排序链表
难度:困难
标签:堆,链表,分治
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路1.:使用堆,将k个链表中的元素,放入堆中,每次取出堆顶元素也就是最小的元素,最后注意要把最后一个顶点的next置为null
public ListNode mergeKLists(ListNode[] lists){
PriorityQueue<ListNode> pq=new PriorityQueue<>(new comparetor());
ListNode head=null;
for (int i = 0; i < lists.length; i++) {
ListNode p=lists[i];
while(p!=null){
pq.add(p);
p=p.next;
}
}
ListNode p=head;
for(int i=0;!pq.isEmpty();i++){
if(i==0){
head=p=pq.poll();
}
else {
p.next=pq.poll();
p=p.next;
}
}
return head;
}
class comparetor implements Comparator<ListNode>{
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val-o2.val;
}
}