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

相关文章

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col

Python视频剪辑合并操作的实现示例

《Python视频剪辑合并操作的实现示例》很多人在创作视频时都需要进行剪辑,本文主要介绍了Python视频剪辑合并操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录介绍安装FFmpegWindowsMACOS安装MoviePy剪切视频合并视频转换视频结论介绍

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-