问题:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

官方难度:

Hard

翻译:

合并k个已排序的链表,得到一个新的链表并且返回其第一个节点。分析并阐述其复杂度。

  1. 这是No.021(Merge Two Sorted Lists)的深入研究。
  2. 可以借鉴归并排序的思想,对于长度为k的数组,依次进行二路归并,返回这两个链表合并之后的头结点(利用No.021现成的代码),下次递归时,入参为长度为(k+1)/2的头结点数组。
  3. 在k为奇数时,先去掉最后一项,剩余项依次二路归并,再将最后一项放入新的数组。
  4. 由于使用递归,所以将递归方法独立出来,因为只要做依次入参检查即可。
  5. 算法的复杂度与归并排序相同,即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/

https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/hard/Q023.java

PS:如有不正确或提高效率的方法,欢迎留言,谢谢!

No.023:Merge k Sorted Lists的更多相关文章

  1. python 中的堆 (heapq 模块)应用:Merge K Sorted Lists

    堆是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短 ...

  2. LeetCode OJ:Merge k Sorted Lists(归并k个链表)

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 类 ...

  3. LeetCode 023 Merge k Sorted Lists

    题目要求:Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and ...

  4. 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 ...

  5. [LeetCode] Merge k Sorted Lists 合并k个有序链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...

  6. Merge k Sorted Lists

    1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...

  7. 71. Merge k Sorted Lists

    Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

  8. LeetCode——Merge k Sorted Lists

    Discription: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its ...

  9. 【Merge K Sorted Lists】cpp

    题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...

随机推荐

  1. CSharpGL(4)设计和使用Camera

    CSharpGL(4)设计和使用Camera +BIT祝威+悄悄在此留下版了个权的信息说: 主要内容 描述在OpenGL中Camera的概念和用处. 设计一个Camera以及操控Camera的Sate ...

  2. Rxjava入门

    简介 RxJava是一个开源的Rx框架ReactiveX的java版本. ReactiveX的主要目的是通过一系列Observable组合异步或事件代码.其中使用的是观察者模式. 可以吧Reactiv ...

  3. c#字段

    1.C#中是不允许用new操作符创建String对象的,编译器会报错. 2.实例字段:使用new对class创建对象直接赋初始值,不适用于struct slass Rect { public int ...

  4. C#设计模式系列:适配器模式(Adapter)

    在实际的软件系统设计和开发中,为了完成某项工作需要购买一个第三方的库来加快开发.这带来一个问题,在应用程序中已经设计好的功能接口,与这个第三方提供的接口不一致.为了使得这些接口不兼容的类可以在一起工作 ...

  5. OpenCASCADE BRep vs. OpenNURBS BRep

    OpenCASCADE BRep vs. OpenNURBS BRep eryar@163.com Abstract. BRep short for Boundary Representation. ...

  6. 深入学习jQuery节点操作

    × 目录 [1]创建节点 [2]插入节点 [3]删除节点[4]复制节点[5]替换节点[6]包裹节点 前面的话 DOM节点操作包括创建节点.插入节点.移除节点.替换节点和复制节点.jQuery也有类似的 ...

  7. MyCAT ER分片的验证

    在这里,构造了两张表,熟悉Oracle的童鞋都知道,dept(部门表)和emp(员工表),其中dept中的deptno是emp表中dept_no的外键. 两表的建表语句如下: create table ...

  8. 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 ...

  9. IDDD 实现领域驱动设计-SOA、REST 和六边形架构

    上一篇:<IDDD 实现领域驱动设计-架构之经典分层> 阅读目录: SOA-面向服务架构 REST 与 RESTful 资源(Resources) 状态(State) 六边形架构 DDD ...

  10. Java基础--反射机制的知识点梳理

    什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量,成员方法,构造方法 ...