赞
踩
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);
- //将所有节点放入 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;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。