问题:

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. Qt Disable QDebug And Warning Output

    如何禁止qDebug的输出 在项目开发的过程中,为了开发方便,我们常常在Qt的Application Output中输出一些内容,慢慢的. 有些qDebug就会被我们遗忘再角落里. 虽然对整个程序影响 ...

  2. solve the problem of 'java web project cannot display verification code'

    my java code of the function: package com.util; import java.awt.Color; import java.awt.Font; import ...

  3. java线程 公平锁 ReentrantLock(boolean fair)

    一.公平锁 1.为什么有公平锁 CPU在调度线程的时候是在等待队列里随机挑选一个线程,由于这种随机性所以是无法保证线程先到先得的(synchronized控制的锁就是这种非公平锁).但这样就会产生饥饿 ...

  4. JavaScript随笔1

    1.NaN不等于NaN 2.判断是不是NaN:isNaN; (强制类型转换) 3.parseInt(3.5) ->3  parseInt(3px)->3 4.pareFloat(3.7)- ...

  5. Security2:Create User

    User 用于访问DB Users based on logins in master (This is the most common type of user.) User based on a ...

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

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

  7. Spire.DOC生成表格测试

    首先,很感谢Jack对我的信任,让我来写一个评测,在此对Jack说一声抱歉,由于本人愚钝,并且最近项目比较紧张,把评测这个事情脱了一个月之久,由于往后的日子可能更忙,所以今晚抽空只能只写了一个小程序来 ...

  8. PS批处理的使用

    一. 前言 做开发的时候,最多的时候就是图片的使用了.有时候图片的处理都按照同样的步骤,比如说统一将图片的大小调整为固定大小,或者统一在所有的图片的的某个位置上加入文字或者小图片等等,这时候PS的批处 ...

  9. Bootstrap Metronic 学习记录(一)简介

    1.简介 是一个基于Bootstrap 3.x的高级管理控制面板主题.Bootstrap Metronic - 是一个完全响应式管理模板.基于Bootstrap3框架.高度可定制的,易于使用.适合从小 ...

  10. ES6 - Note4:Class类

    1.Class类的介绍 在ES6中新增了Class类的概念,让语法看起来更像是面向对象编程,其实这可以说是一个语法糖,ES5可以做到Class绝大部分功能,但也有一些不同.在ES6以前,可以通过构造函 ...