23. 合并 K 个升序链表 - 力扣(LeetCode)

基础知识要求:

Java:方法、while循环、for循环、PriorityQueue类、if判断

Python: 方法、while循环、for循环、heapq 模块、if判断

数据结构:队列 

题目: 

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

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

示例 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

思路解析:

对于合并多个已排序的列表或链表,一种常见的算法是使用最小堆(Min Heap)。在这个问题中,我们可以利用Python的heapq模块来实现最小堆。

Python的heapq模块不了解的,可以看一下我的这篇文章 Python 中的 heapq 模块简介

  1. 初始化:
    • 创建一个虚拟头节点dummy,它的作用是简化链表的操作,因为我们可以直接操作dummy.next来构建结果链表,而不需要担心头节点为空的情况。
    • 创建一个指针p,指向dummy,它将用于遍历并构建结果链表。
    • 创建一个空的最小堆heap,用于存储待合并链表中的节点和它们的值。
  2. 构建最小堆:
    • 遍历所有输入的链表lists
    • 对于每个链表,如果链表不为空,将其头节点的值和节点本身作为一个元组(val, node)加入最小堆中。这里,我们利用节点的值val作为堆排序的优先级。
  3. 合并链表:
    • 当最小堆不为空时,执行以下步骤:
      • 从堆中弹出具有最小值的节点,即当前所有链表中的最小节点。
      • 将这个节点添加到结果链表中,即设置p.next = node,并移动指针p到下一个位置。
      • 如果弹出的节点有下一个节点(即node.next不为空),将这个节点的下一个节点和它的值作为一个新的元组(node.next.val, node.next)加入最小堆中。
  4. 返回结果:
    • 返回虚拟头节点的下一个节点dummy.next,这就是合并后的排序链表的头节点。

Java代码示例:

import java.util.PriorityQueue;  class ListNode {  int val;  ListNode next;  ListNode(int x) { val = x; }  
}  public class Solution {  public ListNode mergeKLists(ListNode[] lists) {  // 创建一个虚拟头节点  ListNode dummy = new ListNode(0);  ListNode p = dummy;  // 创建一个优先队列,按照节点的值排序  PriorityQueue<ListNode> pq = new PriorityQueue<>((a, b) -> a.val - b.val);  // 将所有链表的头节点加入优先队列  for (ListNode head : lists) {  if (head != null) {  pq.offer(head);  }  }  // 从优先队列中取出最小节点,直到队列为空  while (!pq.isEmpty()) {  ListNode node = pq.poll();  p.next = node;  p = p.next;  // 如果当前节点的下一个节点不为空,则加入优先队列  if (node.next != null) {  pq.offer(node.next);  }  }  // 返回结果链表的头节点(虚拟头节点的下一个节点)  return dummy.next;  }  
}

Python代码示例:

import heapq  class ListNode:  def __init__(self, val=0, next=None):  self.val = val  # 节点的值  self.next = next  # 指向下一个节点的指针  def mergeKLists(lists):  # 创建一个虚拟头节点,这样可以避免处理头节点为空的情况  dummy = ListNode(0)    p = dummy  # p用于遍历合并后的链表  # 创建一个最小堆,用于存储(节点值, 节点)对,这样我们可以根据节点值来排序  heap = []    # 遍历所有输入的链表,将非空链表的头节点加入最小堆  for lst in lists:    if lst:  # 如果链表不为空  heapq.heappush(heap, (lst.val, lst))  # 将节点的值和节点作为一个元组加入堆  # 当堆不为空时,继续合并链表  while heap:  # 弹出堆顶元素(即当前所有节点中的最小值节点)  val, node = heapq.heappop(heap)    # 将该节点连接到结果链表的末尾  p.next = node    p = p.next  # 移动指针到下一个位置  # 如果当前节点的下一个节点不为空,将其加入最小堆  if node.next:    heapq.heappush(heap, (node.next.val, node.next))    # 返回合并后链表的头节点(虚拟头节点的下一个节点)  return dummy.next  # 示例:创建三个链表并合并它们  
lists = [  ListNode(1, ListNode(4, ListNode(5))),  # 链表1: 1->4->5  ListNode(1, ListNode(3, ListNode(4))),  # 链表2: 1->3->4  ListNode(2, ListNode(6))  # 链表3: 2->6  
]  # 调用mergeKLists函数合并链表  
merged_list = mergeKLists(lists)  # 打印合并后的链表  
current = merged_list  
while current:  print(current.val, end='->')  # 打印当前节点的值,并在末尾添加"->"  current = current.next  # 移动到下一个节点  
print('None')  # 表示链表结束

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

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

相关文章

11.php-fpm模板(监控页面取值)

php-fpm模板(监控页面取值) 开启监控页面配置 #修改php配置文件 vim /etc/php-fpm.d/www.conf pm.status_path /php_status#修改nginx配置文件,添加到nginx配置文件中 vim /etc/nginx/conf.d/default.conflocation /php_status {root html;fastcgi_pass 127.0.…

肥猫“也能变“型男“?揭秘福派斯牛肉高脂猫粮的神奇效果!

福猫养成指南&#xff1a;福派斯牛肉高脂猫粮的优点与考虑因素 福派斯牛肉高脂猫粮&#xff0c;这款富含蛋白质与脂肪的猫粮&#xff0c;仿佛是猫咪世界中的美味佳肴&#xff0c;让无数猫咪为之倾倒。然而&#xff0c;这款猫粮的利与弊&#xff0c;你是否都了解呢&#xff1f;接…

AI模型部署实战:利用OpenCV的CUDA模块加速视觉模型部署流程

本文首发于公众号【DeepDriving】&#xff0c;欢迎关注。 一. 前言 我在之前的文章《AI模型部署实战&#xff1a;利用CV-CUDA加速视觉模型部署流程》中介绍了如何使用CV-CUDA库来加速视觉模型部署的流程&#xff0c;但是CV-CUDA对系统版本和CUDA版本的要求比较高&#xff0c;在…

大模型介绍

大模型通常指的是参数量超过亿级别&#xff0c;甚至千亿级别的深度学习模型。这类模型能够处理更加复杂的任务&#xff0c;并在各项基准测试中取得了优异的成绩。大模型在自然语言处理、计算机视觉、推荐系统等领域都取得了显著的成果。 大模型的主要优势在于其强大的表征能力&…

k8s的核心组件etcd功能详解【含etcd各类参数详细说明】

etcd 是 Kubernetes 中的一个关键组件&#xff0c;用于存储集群的配置信息、状态和元数据。它通常作为 Kubernetes 集群的数据存储后端&#xff0c;为其他组件提供可靠的分布式键值存储服务。下面我会详细介绍 etcd 的功能以及常见的参数&#xff0c;以及如何配置和使用 etcd。…

Linux实验 Shell编程

实验目的&#xff1a; 熟练掌握Shell程序的建立与执行&#xff1b;掌握Shell变量的两种类型&#xff08;Shell环境变量和用户自定义变量&#xff09;及其用法&#xff1b;掌握Shell中的特殊字符、算术与逻辑运算&#xff1b;掌握Shell中输入输出命令&#xff1b;掌握Shell程序…

在Windows环境下安装CPU版的PyTorch

PytTorch是基于Python开发的&#xff0c;首先需要安装Python&#xff0c;Python的安装很简单&#xff0c;这里不再赘述。而 Windows用户能直接通过conda、pip和源码编译三种方式来安装PyTorch。 打开PyTorch官网&#xff08;PyTorch&#xff09;&#xff0c;在主页中根据自己的…

基于OpenCV年龄与性别识别系统

深入解析基于OpenCV年龄与性别识别系统 在这篇博客中&#xff0c;我们将详细解析一个使用OpenCV进行年龄和性别识别的Python脚本。这个脚本展示了如何利用深度学习模型&#xff0c;从视频或图像中检测人脸并预测每个人脸的年龄和性别。 1. 导入必要的模块 import cv2 as cv …

ELK的详解

ELK是由Elasticsearch、Logstash和Kibana三个开源软件&#xff08;后来又新加了一个FileBeat&#xff09;组成的日志管理解决方案&#xff0c;这一组合在近年来得到了广泛的关注和应用。以下是对这三个组件的详细说明&#xff1a; Elasticsearch&#xff1a; Elasticsearch是…

nginx 负载均衡配置详解

基于 ${nginx_home}/conf/nginx.conf 文件配置实现&#xff0c;如下&#xff1a; http {# 定义server地址upstream server_group {server 192.168.xxx.1:8080;server 192.168.xxx.2:8080;server 192.168.xxx.3:8080;}server {listen 80;location / {root html;index …

python数据分析——时间序列

时间序列 前言一、Datetime 模块常用函数和数据结构的详细解释datetime模块示例一示例二 二、时间运算示例一示例二示例三 三、时间序列分析自回归(Autoregressive model/AR)模型示例 滑动平均(moving average model/MA)模型示例 自回归滑动平均(Autoregressive moving average…

持续总结中!2024年面试必问 100 道 Java基础面试题(四十五)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 100 道 Java基础面试题&#xff08;四十四&#xff09;-CSDN博客 八十九、在Java中&#xff0c;什么是线程局部变量&#xff08;ThreadLocal变量&#xff09;&#xff1f; 在Java中&#xff0c;ThreadLocal变量是…

企业微信hook接口协议,ipad协议http,发送链接的方式邀请成员进群

发送链接的方式邀请成员进群 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","roomid":10696052955013729, "vids":[788130334…

Flutter 中的 CircleAvatar 小部件:全面指南

Flutter 中的 CircleAvatar 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;CircleAvatar 是一个用于显示头像的圆形控件&#xff0c;通常包含一个图标、图片或者一个简单的文本字符。它在设计上与 Material Design 指南中的头像规范相匹配&#xff0c;常用于展示用户信…

C# 常用汇总

时间处理 public static class DateTimeHelper{/// <summary>/// 获取当前时间戳&#xff08;Unix时间戳&#xff09; /// </summary>/// <returns></returns>public static long GetCurrentUnixTimestamp(){DateTimeOffset offset DateTimeOffset.…

Qt---文件系统

一、基本文件操作 1. QFile对文件进行读和写 QFile file( path 文件路径) 读&#xff1a; file.open(打开方式) QlODevice::readOnly 全部读取->file.readAll()&#xff0c;按行读->file.readLine()&#xff0c;atend()->判断是否读到文件尾 …

Java网络编程基础

Java网络编程基础主要涉及进程间通信、网络通信协议、IP地址和端口以及Java提供的网络应用编程接口等核心概念。 进程间通信是Java网络编程的基础。进程是运行中的程序&#xff0c;而进程间通信则是指不同进程之间进行数据交换和共享信息的过程。在Java中&#xff0c;进程间的…

STM32存储左右互搏 USB接口FATS文件读写U盘

STM32存储左右互搏 USB接口FATS文件读写U盘 STM32的USB接口可以例化为Host主机从而对U盘进行操作。SD卡/MicroSD/TF卡也可以通过读卡器转换成U盘使用。这里介绍STM32CUBEIDE开发平台HAL库实现U盘FATS文件访问的例程。 USB接口介绍 常见的USB接口电路部分相似而有不同的连接器…

K8S -----二进制搭建 Kubernetes v1.20

目录 一、准备环境 1.1 修改主机名 1.2 关闭防火墙&#xff08;三台一起&#xff0c;这里只展示master01&#xff09; 1.3 在master添加hosts&#xff08;依旧是三台一起&#xff09; 1.4 调整内核参数并开启网桥模式 二、部署docker引擎 三、部署 etcd 集群 1.在mast…

15.JUC原子类

文章目录 JUC原子类1.JUC中的Atomic原子操作包1.1. 基本原子类&#xff08;Basic Atomic Classes&#xff09;1.2. 数组原子类&#xff08;Array Atomic Classes&#xff09;1.3. 引用原子类&#xff08;Reference Atomic Classes&#xff09;4. 字段更新原子类&#xff08;Fie…