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;
	}
}
相关推荐
你不是我我5 小时前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
雪碧聊技术5 小时前
大模型爆火!Java后端如何抓住Agent全栈开发的风口
java·大模型·agent·全栈开发
逻辑驱动的ken6 小时前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
流年如夢8 小时前
单链表进阶版 -->双向链表
数据结构·链表
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ9 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
無限進步D9 小时前
Java 面向对象高级 接口
java·开发语言
流年如夢10 小时前
单链表 -->增、删、查、改等详细操作
c语言·数据结构
逸Y 仙X10 小时前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索