思路
1、直接全部放入集合中,然后排序,在进行构造节点返回
2、使用归并排序的方式,两两排序合并,最后合并大的。
3、第三中思路就比较巧妙了,可以使用小根堆,每次弹出堆顶,最小值,然后弹出后当前链表指向下一个节点,再压入堆中。如此反复。代码如下:
java
public ListNode mergeKLists(ListNode[] lists) {
if (lists==null||lists.length==0){
return null;
}
//设置一个优先队列
PriorityQueue<ListNode> heap = new PriorityQueue<>((o1, o2) -> o1.val - o2.val);
//将所有节点放入 heap
for (ListNode listNode:lists){
if (listNode!=null){
heap.add(listNode);
}
}
if (heap.isEmpty()) {
return null;
}
//弹出第一个节点
ListNode head = heap.poll();
//记录每次弹出的节点
ListNode pre=head;
//放入最小节点下一个节点
if (pre.next!=null){
heap.add(pre.next);
}
//循环比较
while (!heap.isEmpty()){
//弹出最小节点
ListNode cur = heap.poll();
//移动pre指针
pre.next=cur;
//在移动pre节点
pre=cur;
//最小节点下一个节点入队
if (pre.next!=null){
heap.add(pre.next);
}
}
return head;
}
}