例子:
输入: [ 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; } }