例子:

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