当前位置: 首页 > news >正文

2025年- H97-Lc205--23.合并k个升序链表(链表、小根堆、优先队列)--Java版

1.题目描述

在这里插入图片描述

2.思路

2个链表的合并
分别使用两个指针,指向2个链表的头结点,每次取出值较小的节点,并把对应的指针后移,直到2个链表便利完成。

4个链表的合并
初始4个指针都指向每个链表头结点,每次遍历这4个节点,找到最小的那个节点加入到结果,然后对应指针后移。

如果有n个链表,每次遍历k个节点,时间复杂度就是O(nk),k个节点的优化就是采用小根堆。用小根堆存储k个节点,每次弹出堆顶元素,下一个节点加入堆中,加入的时间复杂度是O(logK)
所以此时的时间复杂度是O(nlogk)

(1)自定义比较函数
(2)把每个链表的头结点加入堆中
(3)定义虚拟头结点,当前指针指向头结点
(4)当堆不空的时候,弹出堆顶元素。同时把节点插入到当起啊指针的下一个节点,当前指针后移
(5)如果当前节点存在下一个节点,把它插入到堆中
(6)返回头结点
在这里插入图片描述
例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.代码实现

/*** 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) {//1.定义小根堆,按照节点升序排序。PriorityQueue<ListNode> heap=new PriorityQueue<>((a,b)->a.val-b.val);//2.把每个链表的头结点加入到堆中for(ListNode node :lists){if(node!= null){heap.offer(node);}}//3.定义虚拟头结点ListNode dummyhead=new ListNode(0);ListNode cur=dummyhead;//4.当堆不空的时候,弹出堆顶最小结点,加入结果链表while(!heap.isEmpty()){ListNode node=heap.poll();//弹出最小哦结点cur.next=node;//加入结果链表;//移动当前指针cur=cur.next;//如果结点还有下一个节点,把它加入堆if(node.next!=null){heap.offer(node.next);}}//6.返回合并后的头结点的下一个节点,虚拟头结点是0return dummyhead.next;}
}
http://www.dtcms.com/a/336077.html

相关文章:

  • 【Python练习】097. 编写一个函数,实现简单的版本控制工具
  • C++ 标准模板库 (^^ゞ 致敬 STL 创始人 Alexander Stepanov
  • 基于Python的旅游推荐系统 Python+Django+Vue.js
  • 计算机网络 TCP三次握手、四次挥手超详细流程【报文交换、状态变化】
  • 工作中使用到的 TRPS 【Temporal Residual Pattern Similarity】和 K-sigma 算法
  • C++——特殊类设计 类型转换 IO流
  • Redis学习--集群 数据分片、哈希槽、集群配置、主从容错迁移、扩缩容
  • live555 rtsp server
  • 通达信【二板爆量涨停】副图/选股指标,首板次日继续强势封板,整合MACD和KDJ指标确保趋势向上,专注二板机会
  • 【计算机网络面试】TCP/IP网络模型有哪几层
  • Python中f - 字符串(f-string)
  • 软考 系统架构设计师系列知识点之杂项集萃(127)
  • 第2章 高并发IO的底层原理
  • 数据结构:二叉搜索树(Binary Search Tree)
  • 【Android】Activity创建、显式和隐式跳转、清单文件声明
  • Pytorch模型复现笔记-VGG讲解+架构搭建(可直接copy运行)+冒烟测试
  • MLArena:一款不错的AutoML工具介绍
  • 【股票数据API接口33】如何获取股票所属指数数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • PCA 实现多向量压缩:首个主成分的深层意义
  • JZ57 和为S的两个数字
  • Traefik网关DNS解析超时问题优化
  • Agent开发进阶路线:从基础响应到自主决策的架构演进
  • C++类型转换详解:从C风格到C++风格
  • 如何理解事件循环和JS的异步?
  • LintCode第137-克隆图
  • PostgreSQL导入mimic4
  • SQL详细语法教程(四)约束和多表查询
  • C语言相关简单数据结构:双向链表
  • Rust Async 异步编程(五):执行器和系统 I/O
  • Effective C++ 条款47: 使用traits classes表现类型信息