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

news2024/12/31 5:00:07

一、题目:

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

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

题目链接

二、示例: 

输入: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 = [[]]
输出:[]

三、分析: 

(1)什么是链表:

链表是一种常见的数据结构,它由一系列节点组成,这些节点通过指针连接。每个节点包含两部分:数据指向下一个节点的指针(next)。链表的特点是它的元素在内存不必连续存储,每个节点可以存储任意类型的数据,并且节点可以动态地添加和删除。

优点:

链表的优点是插入和删除操作的时间复杂度为O(1),而数组的插入和删除操作的时间复杂度为O(n),其中n为元素个数。

缺点:

链表的缺点是访问某个位置的元素需要遍历整个链表,时间复杂度为O(n),而数组的访问操作的时间复杂度为O(1)。

用途:

链表常用于需要频繁进行插入和删除操作的场景,例如实现队列、栈等数据结构,或者用于解决某些特定的问题。

由题可知,题目提供了一个链表数组,且它们都已经做了升序排列处理。让我们将它们合并在同一个升序链表中,并返回。由上面的题目和示例可知,只要我们将链表数组中的每个数组中的数据合并在一起、升序,就能得到正确答案。事实上,是这样吗?

(2)请看下面代码:
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length == 0) return null; //如果链表数组为空,返回
        ListNode ls=new ListNode(); //创建对象,用于获取数组中的对象
        ListNode ks=new ListNode(); //创建对象,用于存储结果
        List<Integer>p=new ArrayList<>(); //创建一个list集合,用于存储中途的各个数组元素
        int len=lists.length; //获取链表数组长度,用于循环
        for(int i=0;i<len;i++){
            ls=lists[i];
            while(ls!=null){
               p.add(ls.val); //添加元素
                ls=ls.next; //下一个对象
            }
        }
        if(p.isEmpty()) return null; //如果集合为空,说明数组里没有对象
        Collections.sort(p); //排序
        for(int i=p.size()-1;i>=0;i--){
            if(i==p.size()-1){ //插入最后一个元素,
                ks=new ListNode(p.get(i)); //不再需要next
            }else {
                ks=new ListNode(p.get(i),ks); //插入其它元素
            }
        }
        return ks; //返回结果
    }
}
(3)运行结果如图:

 


由上图结果可知,上述的解题思路是可以被采纳的。当然,除了用java语言来解决这道题外,还可以用c++来解决这道题。

 四、其它解题方法:

(1)如图是一个链表节点:


由上面对链表的介绍得知,链表每个节点包含两部分:数据指向下一个节点的指针(next)

(一)、数据部分就是用来存储数据的,支持任意类型的数据;

(二)、next指针部分用来指向下一个节点的,节点与节点之间的连接枢纽。

(2)分析: 

由上面我们已经对链表有了一定的了解。我们首先需要对题目提供的链表数组中的每个数据进行排序,在排序结束后,此时创建一个链表——用于存储结果。在进行将数据插入链表操作的时候,需要将已经插入的数据从原集合中删除,同时替换数据。因为用的是set有序集合来对数据进行排序(升序),每次取其头部数据(最小值)插入。最后,调整链表,同时插入已经替换的数据到链表中。

(3)请看下面代码: 
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        typedef pair<int,int>pir; //pair用于可以插入重复数据
        set<pir>s; //set用于排序
        for(int i=0;i<lists.size();i++){
            if(lists[i]==NULL)continue; //判空
            s.insert(pir(lists[i]->val,i)); //将链表中的值插入set中,i为第几个链表的序号
        }
        ListNode new_head,*p=&new_head,*q; //有头链表
        new_head.next=nullptr; //初始化头节点next指针
        while(s.size()){//集合元素不为空
            pir a=*s.begin(); //每一次取出头部数据
            s.erase(s.begin());//并且删除
            q=lists[a.second]; //表示第a.second个链表中的第一个节点(先取)
            lists[a.second]=lists[a.second]->next;//后将其替换
            p->next=q; //将q节点连接到p节点后面
            q->next=nullptr; //初始化q的next指针
            p=q; //p指向结果的最后一位,用于下次插入的节点将能够连接到q的next指针
            if(lists[a.second]){ //将第a.second个链表中的第一个节点插入,
                s.insert(pir(lists[a.second]->val,a.second)); //这个节点是已经替换掉的,不是原节点
            }
        }
        return new_head.next; //返回头节点
    }
};
(四)运行结果如图:

文章到此结束! 

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

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

相关文章

​元宇宙虚拟展厅如何搭建?制作​线上虚拟展厅的成本

电子商务热潮的日益普及&#xff0c;让更多企业开始寻找具有创新性的方式来向客户展示他们的产品和服务。而元宇宙中的虚拟展厅也为企业提供了一个独特的机会&#xff0c;作为帮助企业展示其产品和服务特色的平台&#xff0c;元宇宙越发地受欢迎。不过在元宇宙中制作虚拟展厅的…

自带灭火电池?深蓝SL03托底事故揭秘

近日&#xff0c;网络上的一段热传视频&#xff0c;让不少网友看得先是惊心动魄&#xff0c;然后却又啧啧称奇。 该视频显示&#xff0c;8月18日晚上19点28分&#xff0c;一辆深蓝SL03在行驶中意外遭遇严重托底事故&#xff0c;车辆瞬间腾空跳跃&#xff0c;紧接着底盘出现明火…

【状态模式】设计模式系列:理解与实践(详细解读)

文章目录 状态模式详解&#xff1a;理解与实践1. 引言2. 状态模式简介2.1 定义2.2 应用场景2.3 与其他模式的关系 3. 状态模式的基本概念3.1 上下文(Context)类的角色3.2 状态(State)接口/抽象类3.3 具体状态(Concrete State)类3.4 UML类图和时序图 4. 状态模式的工作原理4.1 如…

用Python解决预测问题_多元线性回归模板

多元线性回归是一种统计学方法&#xff0c;用于分析两个或多个自变量&#xff08;解释变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的关系。在最简单的线性回归模型中&#xff0c;只有一个自变量和一个因变量&#xff0c;它们之间的关系可以用一条直线来…

Java对象的内存结构

文章目录 概述1. 对象头 (Header)Mark Word1. 32位HotSpot虚拟机中的MarkWord2. 64位HotSpot虚拟机中的MarkWord Class PointerArray Length指针压缩原理指针压缩测试 2. 实例数据 (Instance Data)3. 填充数据 (Padding Data) 查看 Java 对象的内存结构使用反射和VisualVM、JCo…

linux下的oracle启动命令

一、服务器断电后&#xff0c;手工启动oracle数据库步骤如下&#xff1a; 1、进入数据库服务器&#xff0c;切换到oracle用户,命令&#xff1a;su - oracle 2、启动数据库&#xff0c;命令&#xff1a; 1&#xff09; sqlplus / as sysdba 2) startup 3&#xff09;如果数据库已…

Rabbit mq 虚拟机stop无法重启

之前从后台进去&#xff0c;这个地方死活无法重启 然后重启docker 以及mq都不行 docker exec -it <CONTAINER_ID_OR_NAME> /bin/bash rabbitmqctl stop_app rabbitmqctl start_app 最后删除虚拟机&#xff0c;然后重建就行了 rabbitmqctl delete_vhost / rabbitmqctl…

C++ | Leetcode C++题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canMeasureWater(int x, int y, int z) {if (x y < z) {return false;}if (x 0 || y 0) {return z 0 || x y z;}return z % gcd(x, y) 0;} };

iPhone设备使用技巧:忘记密码的情况下如何解除iOS 18/17屏幕时间

我们给了儿子一部新手机。在尝试擦除旧手机上的所有内容并恢复出厂设置时&#xff0c;它要求提供 4 位屏幕时间密码。我已经尝试了我们会使用的所有可能性&#xff0c;但无法弄清楚。我们如何绕过这个问题或将手机恢复出厂设置以便我们可以出售它&#xff1f; Apple 社区 对于…

小琳AI课堂:Langchain

大家好&#xff0c;这里是小琳AI课堂&#xff0c;今天我们要探索一个令人兴奋的AI新概念——Langchain。 想象一下&#xff0c;如果我们可以把强大的大型语言模型&#xff0c;比如GPT-3&#xff0c;像乐高积木一样组合起来&#xff0c;会怎么样&#xff1f;这就是Langchain的核…

自定义开屏启动广告页

自定义开屏启动广告页 文章目录 自定义开屏启动广告页效果图简单版轮播方式css 效果图 简单版 图片 倒计时 <template><view class"guide fcc" :style"{ background: url(${ imgUrl }) no-repeat}"><view class"skip_btn" cli…

矢泽妮可二次元html视频动态引导页源码

源码介绍 矢泽妮可二次元html视频动态引导页源码 源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果预览 源码下载 矢泽妮可二次…

Linux系统下的容器安全:深入解析与最佳实践

在云计算和微服务架构的推动下&#xff0c;容器技术因其高效、可移植和灵活的特点&#xff0c;已经成为现代软件开发和部署的首选方案。然而&#xff0c;容器的广泛应用也带来了新的安全挑战&#xff0c;尤其是在Linux系统下&#xff0c;容器安全的实现和维护变得尤为重要。本文…

了解芯片的四大主流架构

四大主流芯片架构&#xff0c;犹如科技领域的四大支柱&#xff0c;各自矗立于技术创新的巅峰。这四大架构——X86、ARM、RISC-V与MIPS&#xff0c;不仅是芯片设计的基石&#xff0c;更是推动信息技术进步的强大动力。 一、芯片架构是什么&#xff1f; 芯片架构是指对芯片的类…

C++ 设计模式——外观模式

外观模式 C 设计模式——外观模式主要组成部分1. 外观类&#xff08;Facade&#xff09;2. 子系统类&#xff08;Subsystem&#xff09;3. 客户端&#xff08;Client&#xff09; 例一&#xff1a;工作流程示例1. 外观类&#xff08;Facade&#xff09;2. 子系统类&#xff08;…

GPU池化技术在油气勘探开发中的应用

01 背景介绍 国内某研究院为实现石油勘探开发专业软件资源的统一管理、统一监控、统一共享和统一计量&#xff0c;自主研发了勘探云管理平台(EPCP)和科研工作业务协同平台。该研究院通过两个平台实现了数十种专业勘探开发软件的共享&#xff0c;种类包括地震资料处理和解释&am…

中国四向穿梭车各角色、各玩家:大盘点

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 四向穿梭车作为现代物流自动化的关键设备&#xff0c;正在全球范围内迅速发展。 本文将对四向穿梭车的不同类别的厂商进行大盘点&#x…

pdfplumber - pdf 数据提取

文章目录 一、关于 pdfplumber安装 二、命令行界面1、基本示例2、选项 三、Python库1、基本示例2、加载PDF3、pdfplumber.PDF类4、pdfplumber.Page 类5、对象char特性line属性rect属性curve 属性派生属性image属性 6、通过pdfminer获取更高级别的pdfminer.six 四、可视化调试1、…

92.WEB渗透测试-信息收集-Google语法(6)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;91.WEB渗透测试-信息收集-Google语法&#xff08;5&#xff09; 监控的漏洞也有很多 打…

探索人工智能的未来:埃里克·施密特2024斯坦福大学分享四

一、语言模型的经济影响 关于语言模型的经济影响&#xff0c;我想先谈谈市场的影响。我们看到一些服务领域的变化速度比预期的要慢&#xff0c;比如 CHEG 和其他相关服务的表现。对此&#xff0c;您是否认为学术界应该获得人工智能补贴&#xff1f;还是说&#xff0c;他们应该…