leetcode第23题

简介: 时间复杂度:假设 N 是所有的数字个数,存到数组是 O(N),排序如果是用快速排序就是 O(Nlog_N)O(NlogN) ,存到链表是 O(N),所以取个最大的,就是 O(Nlog_N)O(NlogN)。空间复杂度:新建了一个链表,O(N)。

image.png

k 个有序链表的合并。

我们用 N 表示链表的总长度,考虑最坏情况,k 个链表的长度相等,都为 n 。

解法一 暴力破解

简单粗暴,遍历所有的链表,将数字存到一个数组里,然后用快速排序,最后再将排序好的数组存到一个链表里。

publicListNodemergeKLists(ListNode[] lists) {
List<Integer>l=newArrayList<Integer>();
//存到数组for (ListNodeln : lists) {
while (ln!=null) {
l.add(ln.val);
ln=ln.next;
        }
    }
//数组排序Collections.sort(l);
//存到链表ListNodehead=newListNode(0);
ListNodeh=head;
for (inti : l) {
ListNodet=newListNode(i);
h.next=t;
h=h.next;
    }
h.next=null;
returnhead.next;
}

时间复杂度:假设 N 是所有的数字个数,存到数组是 O(N),排序如果是用快速排序就是 O(Nlog_N)O(NlogN) ,存到链表是 O(N),所以取个最大的,就是 O(Nlog_N)O(NlogN)

空间复杂度:新建了一个链表,O(N)。

解法二 一列一列比较

image.png


我们可以一列一列的比较,将最小的一个存到一个新的链表里。

publicListNodemergeKLists(ListNode[] lists) {
intmin_index=0;
ListNodehead=newListNode(0);
ListNodeh=head;
while (true) {
booleanisBreak=true;//标记是否遍历完所有链表intmin=Integer.MAX_VALUE;
for (inti=0; i<lists.length; i++) {
if (lists[i] !=null) {
//找出最小下标if (lists[i].val<min) {
min_index=i;
min=lists[i].val;
                }
//存在一个链表不为空,标记改完 falseisBreak=false;
            }
        }
if (isBreak) {
break;
        }
//加到新链表中ListNodea=newListNode(lists[min_index].val);
h.next=a;
h=h.next;
//链表后移一个元素lists[min_index] =lists[min_index].next;
    }
h.next=null;
returnhead.next;
}

时间复杂度:假设最长的链表长度是 n ,那么 while 循环将循环 n 次。假设链表列表里有 k 个链表,for 循环执行 k 次,所以时间复杂度是 O(kn)。

空间复杂度:N 表示最终链表的长度,则为 O(N)。

优先队列的运用印象深刻,此外对两两链表的合并,我们仅仅改变了合并的方式就将时间复杂度降低了很多,美妙!

相关文章
|
存储 索引
维度表和事实表的区别
转载:转载:https://blog.csdn.net/qq_56870570/article/details/118938411
5785 0
|
Linux Shell
【Linux】详解进程终止&&进程等待
【Linux】详解进程终止&&进程等待
207 0
|
存储 小程序 Java
基于Python学生成绩管理系统详细设计和实现(源码+LW+调试文档+讲解等)
基于Python学生成绩管理系统详细设计和实现(源码+LW+调试文档+讲解等)
|
索引 Python
Pandas 2.2 中文官方教程和指南(六)(3)
Pandas 2.2 中文官方教程和指南(六)
106 2
|
Java API
Java注解与反射机制
Java注解与反射概述: - 注解用于元数据,包括元注解`@Target`, `@Retention`, `@Documented`, `@Inherited`。 - 自定义注解用于自定义行为标记,参考[链接]例化后通过`getClass()`获取类信息。 - 主要API涉及类的多种获取方式,如`对象.getClass()`, `类名.class`, `Class.forName()`和内置类型`TYPE`。 - 应用场景包括动态创建对象,获取泛型和注解信息以及分析运行时结构。
|
数据可视化 数据挖掘
数据分享|spss modeler用贝叶斯网络分析糯稻品种影响因素数据可视化
数据分享|spss modeler用贝叶斯网络分析糯稻品种影响因素数据可视化
|
缓存 负载均衡 NoSQL
对于大表按主键+时间+group by的这种时间范围聚合查询的场景
对于大表按主键+时间+group by的这种时间范围聚合查询的场景
174 2
|
传感器 监控 机器人
毕业设计So Easy:STM32实现六足机器人控制系统
很多计算机专业大学生经常和我交流:毕业设计没思路、不会做、论文不会写、太难了...... 针对这些问题,决定分享一些软、硬件项目的设计思路和实施方法,希望可以帮助大家,也祝愿各位学子,顺利毕业!
|
前端开发 JavaScript 网络协议
前端面试题
前面实体
256 0
|
Java Maven 索引
Maven本地nexus搭建私服
Maven本地nexus搭建私服
210 0