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