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

2024-08-23 09:04
文章标签 链表 力扣 23 合并 升序

本文主要是介绍23.合并K个升序链表-----力扣,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目:

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

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

题目链接

二、示例: 

输入: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; //返回头节点}
};
(四)运行结果如图:

文章到此结束! 

这篇关于23.合并K个升序链表-----力扣的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Python中合并列表(list)的六种方法小结

《Python中合并列表(list)的六种方法小结》本文主要介绍了Python中合并列表(list)的六种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、直接用 + 合并列表二、用 extend() js方法三、用 zip() 函数交叉合并四、用

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc