No.023:Merge k Sorted Lists
问题:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
官方难度:
Hard
翻译:
合并k个已排序的链表,得到一个新的链表并且返回其第一个节点。分析并阐述其复杂度。
- 这是No.021(Merge Two Sorted Lists)的深入研究。
- 可以借鉴归并排序的思想,对于长度为k的数组,依次进行二路归并,返回这两个链表合并之后的头结点(利用No.021现成的代码),下次递归时,入参为长度为(k+1)/2的头结点数组。
- 在k为奇数时,先去掉最后一项,剩余项依次二路归并,再将最后一项放入新的数组。
- 由于使用递归,所以将递归方法独立出来,因为只要做依次入参检查即可。
- 算法的复杂度与归并排序相同,即O(nlogn)的时间复杂度,O(n)的空间复杂度。
解题代码:
public static ListNode mergeKLists(ListNode[] lists) {
if (lists == null) {
throw new IllegalArgumentException("Input error");
}
if (lists.length == 0) {
return null;
}
return mergeListsArray(lists);
}
// 合并 k 个有序链表
public static ListNode mergeListsArray(ListNode[] lists) {
// 递归终点
if (lists.length == 1) {
return lists[0];
}
// 下一次递归的头结点数组
ListNode[] next = new ListNode[(lists.length + 1) >>> 1];
// 二路归并
if (lists.length % 2 == 0) {
for (int i = 0; i < lists.length; i += 2) {
next[i >>> 1] = merge2Lists(lists[i], lists[i + 1]);
}
} else {
for (int i = 0; i < lists.length - 1; i += 2) {
next[i >>> 1] = merge2Lists(lists[i], lists[i + 1]);
}
next[next.length - 1] = lists[lists.length - 1];
}
return mergeListsArray(next);
}
// 合并2个有序链表
private static ListNode merge2Lists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
// 返回的第一个节点
ListNode first = l1.val > l2.val ? l2 : l1;
// 上一个节点
ListNode last = new ListNode(0);
while (true) {
if (l1.val > l2.val) {
// 交换l1节点和l2节点,保证下一次循环仍然以l1节点为基准
ListNode swapNode = l2;
l2 = l1;
l1 = swapNode;
}
// 将last节点的next指针指向l1,同时更新last
last.next = l1;
last = l1;
// 带排序的链表遍历完成,剩余链表自然有序
if (l1.next == null) {
l1.next = l2;
break;
}
l1 = l1.next;
}
return first;
}
mergeKLists
相关链接:
https://leetcode.com/problems/merge-k-sorted-lists/
PS:如有不正确或提高效率的方法,欢迎留言,谢谢!
No.023:Merge k Sorted Lists的更多相关文章
- python 中的堆 (heapq 模块)应用:Merge K Sorted Lists
堆是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短 ...
- LeetCode OJ:Merge k Sorted Lists(归并k个链表)
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 类 ...
- LeetCode 023 Merge k Sorted Lists
题目要求:Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and ...
- LeetCode之“链表”:Merge Two Sorted Lists && Merge k Sorted Lists
1. Merge Two Sorted Lists 题目链接 题目要求: Merge two sorted linked lists and return it as a new list. The ...
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...
- Merge k Sorted Lists
1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...
- 71. Merge k Sorted Lists
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- LeetCode——Merge k Sorted Lists
Discription: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its ...
- 【Merge K Sorted Lists】cpp
题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...
随机推荐
- CSharpGL(4)设计和使用Camera
CSharpGL(4)设计和使用Camera +BIT祝威+悄悄在此留下版了个权的信息说: 主要内容 描述在OpenGL中Camera的概念和用处. 设计一个Camera以及操控Camera的Sate ...
- Rxjava入门
简介 RxJava是一个开源的Rx框架ReactiveX的java版本. ReactiveX的主要目的是通过一系列Observable组合异步或事件代码.其中使用的是观察者模式. 可以吧Reactiv ...
- c#字段
1.C#中是不允许用new操作符创建String对象的,编译器会报错. 2.实例字段:使用new对class创建对象直接赋初始值,不适用于struct slass Rect { public int ...
- C#设计模式系列:适配器模式(Adapter)
在实际的软件系统设计和开发中,为了完成某项工作需要购买一个第三方的库来加快开发.这带来一个问题,在应用程序中已经设计好的功能接口,与这个第三方提供的接口不一致.为了使得这些接口不兼容的类可以在一起工作 ...
- OpenCASCADE BRep vs. OpenNURBS BRep
OpenCASCADE BRep vs. OpenNURBS BRep eryar@163.com Abstract. BRep short for Boundary Representation. ...
- 深入学习jQuery节点操作
× 目录 [1]创建节点 [2]插入节点 [3]删除节点[4]复制节点[5]替换节点[6]包裹节点 前面的话 DOM节点操作包括创建节点.插入节点.移除节点.替换节点和复制节点.jQuery也有类似的 ...
- MyCAT ER分片的验证
在这里,构造了两张表,熟悉Oracle的童鞋都知道,dept(部门表)和emp(员工表),其中dept中的deptno是emp表中dept_no的外键. 两表的建表语句如下: create table ...
- CHECK_NRPE: Received 0 bytes from daemon. Check the remote server logs for error messages.
今天,在用icinga服务器端测试客户端脚本时,报如下错误: [root@mysql-server1 etc]# /usr/local/icinga/libexec/check_nrpe -H 192 ...
- IDDD 实现领域驱动设计-SOA、REST 和六边形架构
上一篇:<IDDD 实现领域驱动设计-架构之经典分层> 阅读目录: SOA-面向服务架构 REST 与 RESTful 资源(Resources) 状态(State) 六边形架构 DDD ...
- Java基础--反射机制的知识点梳理
什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量,成员方法,构造方法 ...