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;
	}
}
相关推荐
阿熊不凶2 分钟前
c语言中堆和栈的区别
java·c语言·jvm
Lethehong10 分钟前
飞算JavaAI:革新Java开发体验的智能助手
java·开发语言·java开发·飞算javaai炫技赛
泰勒疯狂展开11 分钟前
Java研学-RabbitMQ(八)
java·rabbitmq·java-rabbitmq
-睡到自然醒~16 分钟前
[go] 命令模式
java·开发语言·javascript·后端·golang·命令模式
别来无恙14918 分钟前
JavaWeb核心:HttpServletRequest与HttpServletResponse详解
java·前端·servlet
寒士obj21 分钟前
熟悉并使用Spring框架 - XML篇
xml·java·spring
多读书1931 小时前
Java多线程进阶-深入synchronized与CAS
java·开发语言·java-ee
AAA修煤气灶刘哥1 小时前
Lombok坑哭了!若依框架一行@Data炸出Param为null,我卡了一下午才发现BaseEntity的猫腻
java·后端
啊阿狸不会拉杆1 小时前
《算法导论》第 24 章 - 单源最短路径
开发语言·数据结构·c++·算法·php
23遇见1 小时前
顺序表插入删除
数据结构