数据结构与算法——Java实现 30.合并多个有序链表 小顶堆实现

后来我们都走了很久,远到提及往事时,

总会加上once upon a time

                                                —— 24.10.6

23. 合并 K 个升序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[1->4->5,1->3->4,2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i] 按 升序 排列
  • lists[i].length 的总和不超过 10^4

思路

将k个升序链表依次遍历,因为他们升序,所以比较三个升序链表的第一个元素值,将三个元素中的最小值放入堆顶,然后被放入元素的那个链表的指针向后移动一位,直到k个升序链表中的所有元素都被进行比较移入堆中,由于是小顶堆,所以小的元素会移动在前,形成一个升序链表,最终得出合并后的升序链表

小顶堆实现

public class MinHeap {ListNode[] array;int size;public MinHeap(int capacity) {array = new ListNode[capacity];}public boolean offer(ListNode node) {if (isFull()){return false;}int child = size;size++;int parent = (child - 1) / 2;while (child >0 && node.val < array[parent].val) {array[child] = array[parent];child = parent;parent = (child - 1) / 2;}array[child] = node;return true;}public ListNode poll() {if (isEmpty()) {return null;}swap(0,size-1);size--;ListNode e = array[size];array[size] = null;// 下潜down(0);return e;}private void down(int parent) {int left = 2 * parent+1;int right = left + 1;// 假设父元素优先级最高int max = parent;if (left < size && array[left].val < array[max].val) {max = left;}if (right < size && array[right].val < array[max].val) {max = right;}// 有孩子优先级大于父节点if (max != parent) {swap(max,parent);down(max);}}private void swap(int i, int j) {ListNode temp = array[i];array[i] = array[j];array[j] = temp;}public boolean isEmpty() {return size == 0;}public boolean isFull(){return size == array.length;}
}

 主函数

public class LeetCode23MergeMoreList {public ListNode mergeKLists(ListNode[] lists) {MinHeap heap = new MinHeap(lists.length);// 1.将链表的头结点加入小顶堆for (ListNode node : lists) {if (node != null) {heap.offer(node);}}// 2.不断从堆顶移除最小元素,加入新链表ListNode s = new ListNode(-1,null);ListNode cur = s;while (!heap.isEmpty()) {ListNode node = heap.poll();cur.next = node;cur = node;if (cur.next != null) {heap.offer(node.next);}}return s.next;}public static void main(String[] args) {ListNode[] lists = {ListNode.of(1,4,5),ListNode.of(2,3,6),ListNode.of(3,4,7),};ListNode m = new LeetCode23MergeMoreList().mergeKLists(lists);System.out.println(m);}
}

 

力扣

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/class Solution {public ListNode mergeKLists(ListNode[] lists) {MinHeap heap = new MinHeap(lists.length);// 1.将链表的头结点加入小顶堆for (ListNode node : lists) {if (node != null) {heap.offer(node);}}// 2.不断从堆顶移除最小元素,加入新链表ListNode s = new ListNode(-1,null);ListNode cur = s;while (!heap.isEmpty()) {ListNode node = heap.poll();cur.next = node;cur = node;if (cur.next != null) {heap.offer(node.next);}}return s.next;}static class MinHeap {ListNode[] array;int size;public MinHeap(int capacity) {array = new ListNode[capacity];}public boolean offer(ListNode node) {if (isFull()){return false;}int child = size;size++;int parent = (child - 1) / 2;while (child >0 && node.val < array[parent].val) {array[child] = array[parent];child = parent;parent = (child - 1) / 2;}array[child] = node;return true;}public ListNode poll() {if (isEmpty()) {return null;}swap(0,size-1);size--;ListNode e = array[size];array[size] = null;// 下潜down(0);return e;}private void down(int parent) {int left = 2 * parent+1;int right = left + 1;// 假设父元素优先级最高int max = parent;if (left < size && array[left].val < array[max].val) {max = left;}if (right < size && array[right].val < array[max].val) {max = right;}// 有孩子优先级大于父节点if (max != parent) {swap(max,parent);down(max);}}private void swap(int i, int j) {ListNode temp = array[i];array[i] = array[j];array[j] = temp;}public boolean isEmpty() {return size == 0;}public boolean isFull(){return size == array.length;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/55502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000010 案列 EXCEL单元格格式。EXCEL文本型和常规型转…

推荐一个可以把PDF样本册转换为翻页电子书的网站

​随着互联网的普及&#xff0c;越来越多的企业和个人开始意识到线上展览的重要性。如何将实体样本册转化为线上版本&#xff0c;让更多人了解和欣赏自己的产品与服务&#xff1f; 一、网站简介 这款PDF样本册免费上传网站名为“FLBOOK”&#xff0c;致力于为广大用户提供便捷…

【C语言】基础篇

简单输出“helloword” #include<stdio.h> int main(){printf("hello world!");return 0; } 和与商 #include<stdio.h> int main(){int a,b,sum,quotient;printf("Enter two numbers:");scanf("%d %d",&a,&b);sum a b…

构建 10 万卡 GPU 集群的技术挑战

构建 10 万卡 GPU 集群的技术挑战 摘要 揭示AI训练集群关键基础设施挑战&#xff0c;探讨突破现有AI瓶颈的必要性与10万GPU集群&#xff08;如OpenAI、Meta&#xff09;建设所面临挑战与需求。 构建网络拓扑&#xff0c;需权衡多层交换机成本、带宽与维护。本文对比Ethernet与…

【IEEE PDF eXpress】格式不对

目录 一、问题二、解决方法 一、问题 word的文档&#xff0c;用IEEE PDF eXpress网站生成pdf后&#xff0c;提交论文出现错误&#xff1a; Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习04(环境准备)

4 创建docker容器 4.1创建网络 [rootlocalhost wutool]# docker network create -d macvlan --subnet192.168.137.0/24 --gateway192.168.137.2 --ip-range192.168.137.0/24 -o parentens33 nat 52af11381bfd655d175e4168265b2a507793e8fe48f119db846949ffd4dd27de [rootlocal…

【JavaWeb】javaweb目录结构简介【转】

以上图说明&#xff1a; bbs目录代表一个web应用bbs目录下的html,jsp文件可以直接被浏览器访问WEB-INF目录下的资源是不能直接被浏览器访问的web.xml文件是web程序的主要配置文件所有的classes文件都放在classes目录下jar文件放在lib目录下

Stream流的终结方法(二)——collect

1.Stream流的终结方法 2. collect方法 collect方法用于收集流中的数据放到集合中去&#xff0c;可以将流中的数据放到List&#xff0c;Set&#xff0c;Map集合中 2.1 将流中的数据收集到List集合中 package com.njau.d10_my_stream;import java.util.*; import java.util.f…

鸿蒙开发(NEXT/API 12)【管理应用与Wear Engine服务的连接状态】手机侧应用开发

监测应用与Wear Engine服务的连接状态 华为运动健康App在后台停止服务&#xff08;如功耗过高&#xff09;&#xff0c;从而导致应用与Wear Engine服务的连接状态发生变化。对于类似这种不确定的断开情况&#xff0c;开发者可以通过本功能特性了解当前应用和Wear Engine的连接…

五子棋双人对战项目(3)——匹配模块

目录 一、分析需求 二、约定前后端交互接口 匹配请求&#xff1a; 匹配响应&#xff1a; 三、实现游戏大厅页面&#xff08;前端代码&#xff09; game_hall.html&#xff1a; common.css&#xff1a; game_hall.css&#xff1a; 四、实现后端代码 WebSocketConfig …

初识算法 · 双指针(2)

目录 前言&#xff1a; 盛最多水的容器 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 有效三角形的个数 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 前言&#xff1a; 本文介绍两个题目&#xff0c;盛最多水的容器和有效三…

Kotlin IntelliJ IDEA 环境搭建

Kotlin IntelliJ IDEA 环境搭建 引言 Kotlin,作为一门现代编程语言,因其简洁、表达性强以及与Java的完全互操作性而受到越来越多开发者的青睐。IntelliJ IDEA,作为JetBrains公司推出的集成开发环境(IDE),为Kotlin开发提供了强大的支持。本文将详细介绍如何在IntelliJ I…

【Blender Python】5.Blender场景中的集合

概述 这里的“集合”是指Blender场景中的集合。你可以在“大纲视图”面板中看到 图标的&#xff0c;就是集合&#xff0c;可以看做是文件夹&#xff0c;用于分类和整理场景中的对象。 获取场景的集合 >>> C.scene bpy.data.scenes[Scene]>>> C.scene.coll…

在centos7.9启动docker 18.09.9报错 error initializing graphdriver: overlay2

一、问题 在centos7.9启动docker 18.09.9报错&#xff1a;Error starting daemon: error initializing graphdriver: overlay2: the backing xfs filesystem is formatted without d_type support, which leads to incorrect behavior. Reformat the filesystem with ftype1 to…

PromQL:高效查询时间序列数据的利器

全文目录&#xff1a; 前言前言PromQL 概述Prometheus 时间序列数据模型PromQL 支持的数据类型 PromQL 基础语法与查询示例1. 基础查询查询瞬时向量查询带标签的时间序列 2. 范围查询3. 聚合操作4. 函数操作5. 偏移量操作 PromQL 实战案例案例 1&#xff1a;监控系统 CPU 使用率…

模仿postman自研的HTTP Client Chrome插件,可绕过浏览器同源政策发起跨域请求

文章目录 1、项目背景2、准备好服务端接口3、chrome扩展开发4、扩展程序演示1、项目背景 在企业开发过程中,有时候需要手动调用线上服务的接口,我们的服务是通过cookie来保存登录态的,且接口做了身份验证,此时有两种情况: 接口是GET类型,则可以直接在浏览器地址栏输入接…

AI 大模型的核心能力与应用场景全解析

深入理解 AI 大模型&#xff1a;核心能力与应用场景全解析 AI大模型是什么 通过概念考察的方式了解AI大模型&#xff0c;拆开来看。 AI领域术语丰富&#xff0c;涵盖模式识别、自然语言处理、神经网络、机器学习、深度学习、强化学习及人类反馈强化学习。大模型&#xff1a;把…

【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段

文章目录 【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段1 问题由来2 操作流程步骤1&#xff1a;打开代码片段定制页步骤2&#xff1a;在新标签页输入定制 XML步骤3&#xff1a;保存定义内容步骤4&#xff1a;功能测试 3 拓展 【工欲善其事】巧用 Sublime Text 生成带…

【笔记】信度检验

一、信度 信度是指测量结果的一致性和稳定性。 1.一致性&#xff08;Consistency&#xff09; 一致性指的是测量工具内部各个部分或项目之间的协调一致程度。高一致性意味着测量工具的不同部分都在测量同一个概念或特质。 例子&#xff1a;智力测试 假设我们有一个包含100…

c语言函数变长参数原理分析

在 C 语言中&#xff0c;函数可以接受可变数量的参数&#xff0c;这种函数称为“变长参数函数”。变长参数的实现主要依靠标准库 <stdarg.h> 中定义的宏。以下是变长参数的原理、使用方法以及在底层的实现机制的详细解释。 1. 变长参数函数的声明 变长参数函数的基本形…