34、链表-合并K个升序链表

思路

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;
	}
}
相关推荐
garmin Chen6 小时前
redis面试题
java·数据库·redis·缓存
chen<>6 小时前
C++ 六种 memory_order:从原子性到线程间可见性.md
java·linux·开发语言·c++
十年Java程序媛6 小时前
SpringBoot3 + JDK17 实战复盘:HikariCP 连接耗尽,虚拟线程场景额外注意事项
java·spring boot
二十雨辰7 小时前
[Java]-JVM面试题
java·开发语言·jvm
cfm_29147 小时前
ConcurrentHashMap 线程安全机制与 JDK 1.8 演进
java·开发语言·安全
tqs_123457 小时前
值传递与引用传递
java·开发语言·python
2601_962181967 小时前
Spring boot从0到1 - day01
java·spring boot·后端
典典分享指南8 小时前
短视频分镜提示词:让 AI 出片的产品口播
java·c#·bash·composer·symfony
IT_Octopus8 小时前
G1 与 GC 日志入门课程(以本次离线菜单 Full GC 事故为教材)
java·jvm
cfm_29148 小时前
ReentrantLock 中 lock 与 tryLock 核心区别
java