例子:
输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6
解析1:优先队列的使用。因为是有序链表,所以将他们的头节点放进优先队列,依次进行选取最小的节点。
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
int len = lists.length;
if(len == 0){
return null;
}
PriorityQueue<ListNode> priorityQueue = new PriorityQueue<>(len, Comparator.comparingInt(a -> a.val));//定义一个长为K的优先队列
ListNode dummy = new ListNode(-1);
ListNode h = dummy;
for(ListNode list : lists){
if(list != null){//单链表非空
priorityQueue.add(list);//将每个链表加入队列
}
}
while(!priorityQueue.isEmpty()){
ListNode node = priorityQueue.poll();//队列最小的出队
h.next = node;
h = h.next;
if(h.next != null){//指向的单链表后继非空
priorityQueue.add(h.next);
}
}
return dummy.next;
}
} 
京公网安备 11010502036488号