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;
	}
}
相关推荐
无名-CODING1 天前
Spring事务管理完全指南:从零到精通(上)
java·数据库·spring
fengxin_rou1 天前
【黑马点评实战篇|第一篇:基于Redis实现登录】
java·开发语言·数据库·redis·缓存
数智工坊1 天前
【数据结构-栈】3.1栈的顺序存储-链式存储
java·开发语言·数据结构
短剑重铸之日1 天前
《设计模式》第七篇:适配器模式
java·后端·设计模式·适配器模式
DFT计算杂谈1 天前
VASP+Wannier90 计算位移电流和二次谐波SHG
java·服务器·前端·python·算法
多多*1 天前
2月3日面试题整理 字节跳动后端开发相关
android·java·开发语言·网络·jvm·adb·c#
执着2591 天前
力扣102、二叉树的层序遍历
数据结构·算法·leetcode
元亓亓亓1 天前
考研408--数据结构--day5--栈与队列的应用
数据结构·考研··408·队列
无名的小白1 天前
openclaw使用nginx反代部署过程 与disconnected (1008): pairing required解决
java·前端·nginx
小高Baby@1 天前
Golang中面向对象的三大特性之多态的理解
数据结构·golang