合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
用容量为K的最小堆优先队列,把链表的头结点都放进去,然后出当前优先队列中最小的值,挂上链表,,然后让出队的那个节点的下一个节点入队并自动比较排序好,再出当前优先队列中最小的,直到优先队列为空。
PriorityQueue里面自然就排好序了,不用管直接取出来拼接成链表就行
想想怎么用分治来做,下次???
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) {
return null;
}
ListNode dummyHead = new ListNode(0);
ListNode curr = dummyHead;
// 通过PriorityQueue
PriorityQueue<ListNode> pq = new PriorityQueue<>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
});
for (ListNode list : lists) {
if (list == null) {
continue;
}
pq.add(list);//存入的是三个头节点的比较后存进去pq里
}
while (!pq.isEmpty()) {
ListNode nextNode = pq.poll();//取队列第一个数
curr.next = nextNode;
curr = curr.next;//存入中间变量curr
//System.out.print(curr.val);
if (nextNode.next != null) {
pq.add(nextNode.next);//把第一个点的下个节点添加pq并从新排序,反复下去
}
}
return dummyHead.next;
}
}