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;
	}
}
相关推荐
qq_12498707532 小时前
重庆三峡学院图书资料管理系统设计与实现(源码+论文+部署+安装)
java·spring boot·后端·mysql·spring·毕业设计
大学生资源网2 小时前
java毕业设计之“知语”花卉销售网站的设计与实现源码(源代码+文档)
java·mysql·毕业设计·源码·springboot
小鸡脚来咯2 小时前
Redis三大问题:穿透、击穿、雪崩(实战解析)
java·spring·mybatis
桦说编程2 小时前
并发编程高级技巧:运行时检测死锁,告别死锁焦虑
java·后端·性能优化
jiayong232 小时前
Spring AI Alibaba 深度解析(三):实战示例与最佳实践
java·人工智能·spring
梁同学与Android2 小时前
Android ---【经验篇】ArrayList vs CopyOnWriteArrayList 核心区别,怎么选择?
android·java·开发语言
ss2733 小时前
从零实现线程池:自定义线程池的工作线程设计与实现
java·开发语言·jvm
苗壮.3 小时前
CommandLineRunner 是什么?
java
石工记3 小时前
windows 10直接安装多个JDK
java·开发语言
菜鸟233号3 小时前
力扣669 修剪二叉搜索树 java实现
java·数据结构·算法·leetcode