题目

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. 腾讯课堂老师qq号码转换成 teacherid

    result = 215696775^858006833 if(result){ result=4294967296+result; } alert(result);

  2. JMX RMI 攻击利用

    攻击者通过构造恶意的MBean,调用 getMBeansFromURL 从远程服务器获取 MBean,通过MLet标签提供恶意的MBean对象下载. 前提条件: 允许远程访问,没有开启认证 (com. ...

  3. Kafka学习之路 (一)Kafka的简介

    一.简介 1.1 概述 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/ng ...

  4. PAT B1010 一元多项式求导 (25 分)

    设计函数求一元多项式的导数.(注:x​n​​(n为整数)的一阶导数为nx​n−1​​.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数).数字间以空格分隔. ...

  5. JAVA框架 Spring AOP--切入点表达式和通知类型

    一:AOP的相关术语: 1)Joinpoint(连接点):所谓的连接点是指那些可以被拦截点,在spring中这些点是指方法.因为在spring中支持方法类型的连接点. 2)Pointcut(切入点): ...

  6. E - A Twisty Movement

    A dragon symbolizes wisdom, power and wealth. On Lunar New Year's Day, people model a dragon with ba ...

  7. Found more than one concrete type for given DbContext Type (xxx.xxxx.xxx) define MultiTenancySideAttribute with Tenant

    错误提示: Found more than one concrete type for given DbContext Type (Abp.Zero.EntityFramework.AbpZeroCo ...

  8. 如何使用jstack分析线程状态

    背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高 ...

  9. 20155207 EXP7 网络欺诈技术防范

    20155207 EXP7 网络欺诈技术防范 实验内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 具体有 (1)简单应用SET工具建立冒名网站 (2)etterca ...

  10. 20155302《网络对抗》Exp8 Web基础

    20155302<网络对抗>Exp8 Web基础 实验内容 (1).Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个 ...