题目

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

翻译

合并k个有序的链表

Hints

Related Topics: LinkedList, Divide and Conquer, Heap

Solution1:Divide and Conquer

参考 归并排序-维基百科

思路:分治,先分成两个子任务,然后递归子任务,最后回溯回来..这里就可以将k个链表分成两半,再继续划分,直到最后还剩下2个链表就利用之前做的 Merge Two Sorted Lists 来合并

Solution2:Heap

用到了堆的数据结构(太菜了想不到,还是要学习一个)

学习一下 堆的数据结构,维护一个大小为k的堆,每次取堆顶的最小元素放到结果中,然后再把该元素的下一个元素放到堆中,重新维护好;因为每个链表都是有序的,每次都是取堆中最小的元素,这样当所有的链表都读完的时候,result链表中就是所有的元素从小到大排列了

Solution2要读一遍所有元素:即 k*n 次,读取元素又将新元素插入堆中是 logn的复杂度,所有最后时间复杂度是O(nk logn)..

代码

Java

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
//Solution1
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
return Divide(lists, 0, lists.length-1);
} public static ListNode Divide(ListNode[] lists, int start, int end){
if(start==end) return lists[start];
if(start<end){
int middle = (start+end)/2;
ListNode l1 = Divide(lists,start,middle);
ListNode l2 = Divide(lists,middle+1,end);
return merge2Lists(l1, l2);
}else
return null;
} public static ListNode merge2Lists(ListNode l1,ListNode l2){
if(l1==null) return l2;
if(l2==null) return l1; if(l1.val<l2.val){
l1.next = merge2Lists(l1.next,l2);
return l1;
}else{
l2.next = merge2Lists(l1,l2.next);
return l2;
}
}
}

Python

# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
//Solution2
from Queue import PriorityQueue
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
dummy = curr = ListNode(None)
q = PriorityQueue() for node in lists:
if node: q.put((node.val,node));
while q.qsize()>0:
curr.next = q.get()[1]
curr = curr.next
if curr.next:
q.put((curr.next.val,curr.next))
return dummy.next

一些用途

在分布式系统中非常常见,来自不同client的sorted list要在central server上面merge起来

一些参考

leetcode discuss

归并排序-维基百科

数据结构之“堆”

Merge k Sorted Lists -- LeetCode

蜗牛慢慢爬 LeetCode 23. Merge k Sorted Lists [Difficulty: Hard]的更多相关文章

  1. # 蜗牛慢慢爬 LeetCode 21. Merge Two Sorted Lists [Difficulty: Easy]

    题目 Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...

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

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

  3. [leetcode 23]Merge k Sorted Lists

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

  4. [LeetCode] 23. Merge k Sorted Lists ☆☆☆☆☆

    转载:https://leetcode.windliang.cc/leetCode-23-Merge-k-Sorted-Lists.html 描述 Merge k sorted linked list ...

  5. LeetCode 23 Merge k Sorted Lists(合并k个有序链表)

    题目链接: https://leetcode.com/problems/merge-k-sorted-lists/?tab=Description Problem: 给出k个有序的list, 将其进行 ...

  6. Java [leetcode 23]Merge k Sorted Lists

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

  7. [leetcode]23. Merge k Sorted Lists归并k个有序链表

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

  8. [LeetCode] 23. Merge k Sorted Lists ☆☆

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

  9. [LeetCode]23. Merge k Sorted Lists合并K个排序链表

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

随机推荐

  1. nano,pico文本编辑器,debian执行crontab -e

    debian执行crontab -e的时候出现: Edit this file to introduce tasks to be run by cron.## Each task to run has ...

  2. Python2.7-copy_reg

    copy_reg 模块,提供了在 pickle 或是 copy 特定对象时,可以运行一个指定的函数,作为对象的构造器 模块方法: copy_reg.constructor(object):声明一个可调 ...

  3. (转)LVS+Keepalived使用总结 vip丢失

    /sbin/ifconfig lo: $vip broadcast $vip netmask 255.255.255.255 up /sbin/ifconfig lo: 172.16.254.63 b ...

  4. centos 7 163 yum 源 python 2.7.5

    安装 repo 源. repo 源一般包括 base, updates, Extras 三部分. $ cd /etc/yum.repos.d/ $ wget http://mirrors.163.co ...

  5. day07--字符编码、文件处理

    今日内容: 字符编码 文件处理 字符编码: 把字符编码成二进制 各个国家拥有各自的字符编码,这样会导致交流产生问题.所以后面推出了内存使用unicode,硬盘使用UTF-8这个模式 unicode有两 ...

  6. 蜻蜓fm面试

    一面: 面试官首先看简历上写了在腾讯的实习,然后就探讨了半天,各种虚拟化的技术.... 说完之后,估计都半小时过去了,然后就又说了一下你用什么语言,你做的东西都比较偏底层呢,然后你对工作有什么要求吗? ...

  7. 20155217《网络对抗》Exp05 MSF基础应用

    20155217<网络对抗>Exp05 MSF基础应用 实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 一个主动攻击实践,如ms ...

  8. # 20155319 Exp3 免杀原理与实践

    20155319 Exp3 免杀原理与实践 基础问题 (1)杀软是如何检测出恶意代码的? 基于特征码的检测 启发式的恶意软件检测 基于行为的恶意软件检测 (2)免杀是做什么? 免杀,从字面进行理解,避 ...

  9. 20155325 Exp2 后门原理与实践

    基础问答 例举你能想到的一个后门进入到你系统中的可能方式? 乱点链接 学电脑小白不正确配置电脑 下载非官网软件 例举你知道的后门如何启动起来(win及linux)的方式? 软件:ncat socat ...

  10. Luogu T24242 购物券Ⅰ(数据已加强)

    这是一道比赛时的题目,但由于我没报名,所以浪费了一个大好的切水题的机会. 是经典的meet in middle(折半搜索)的模板题,但是之前一直没找到这种题目,今天终于看到了. 由于m的范围极大,因此 ...