关闭

Merge k Sorted Lists(hard)

标签: Merge k Sorted Lists
172人阅读 评论(0) 收藏 举报
分类:

题目

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

题意

    归并k个有序列表

分析

   用到了堆的数据结构。维护一个大小为k的堆,每次去堆顶的最小元素放到结果中,然后读取该元素的下一个元素放入堆中,重新维护好。因为每个链表是有序的,每次又是去当前k个元素中最小的,所以当所有链表都读完时结束,这个时候所有元素按从小到大放在结果链表中。这个算法每个元素要读取一次,即是k*n次,然后每次读取元素要把新元素插入堆中要logk的复杂度,所以总时间复杂度是O(nklogk)。空间复杂度是堆的大小,即为O(k)

实现

 
public ListNode mergeKLists(ListNode[] lists) {
    if(lists==null||lists.length==0)
        return null;
 
    PriorityQueue<ListNode> queue = new PriorityQueue<ListNode>(new Comparator<ListNode>(){
        public int compare(ListNode l1, ListNode l2){
            return l1.val - l2.val;
        }
    });
 
    ListNode head = new ListNode(0);
    ListNode p = head;
 
    for(ListNode list: lists){
        if(list!=null)
            queue.offer(list);
    }    
 
    while(!queue.isEmpty()){
        ListNode n = queue.poll();
        p.next = n;
        p=p.next;
 
        if(n.next!=null)
            queue.offer(n.next);
    }    
 
    return head.next;
 
}
另一种:

   这道题目在分布式系统中非常常见,来自不同client的sorted list要在central server上面merge起来。这个题目一般有两种做法,下面一一介绍并且分析复杂度。 第一种做法比较容易想到,就是有点类似于MergeSort的思路,就是分治法,不了解MergeSort的朋友,请参见 归并排序-维基百科 ,是一个比较经典的O(nlogn)的排序算法,还是比较重要的。思路是先分成两个子任务,然后递归求子任务,最后回溯回来。这个题目也是这样,先把k个list分成两半,然后继续划分,知道剩下两个list就合并起来,合并时会用到 Merge Two Sorted Lists 这道题,不熟悉的朋友可以复习一下。代码如下:

public ListNode mergeKLists(ArrayList<ListNode> lists) {
    if(lists==null || lists.size()==0)
        return null;
    return helper(lists,0,lists.size()-1);
}
private ListNode helper(ArrayList<ListNode> lists, int l, int r)
{
    if(l<r)
    {
        int m = (l+r)/2;
        return merge(helper(lists,l,m),helper(lists,m+1,r));
    }
    return lists.get(l);
}
private ListNode merge(ListNode l1, ListNode l2)
{ 
    ListNode dummy = new ListNode(0);
    dummy.next = l1;
    ListNode cur = dummy;
    while(l1!=null && l2!=null)
    {
        if(l1.val<l2.val)
        {
            l1 = l1.next;
        }
        else
        {
            ListNode next = l2.next;
            cur.next = l2;
            l2.next = l1;
            l2 = next;
        }
        cur = cur.next;
    }
    if(l2!=null)
        cur.next = l2;
    return dummy.next;
}

假设总共有k个list,每个list的最大长度是n,那么运行时间满足递推式T(k) = 2T(k/2)+O(n*k)。根据主定理,可以算出算法的总复杂度是O(nklogk)。如果不了解主定理的朋友,可以参见 主定理-维基百科 。空间复杂度的话是递归栈的大小O(logk)。


参考

http://www.tuicool.com/articles/ZnuEVfJ


0
0
查看评论

LeetCode Merge k Sorted Lists 解题报告

合并K个已排序的数组,并分析整个算法的复杂度。 最朴素的方法TLE,借鉴归并排序的算法顺利AC,算法时间复杂度:NlogK
  • worldwindjp
  • worldwindjp
  • 2014-10-11 15:23
  • 8265

【LeetCode】23. Merge k Sorted Lists 基于Java的解法

23. Merge k Sorted Lists Total Accepted: 88102 Total Submissions: 372066 Difficulty: Hard Merge k sorted linked...
  • Jin_Kwok
  • Jin_Kwok
  • 2016-06-04 00:46
  • 1560

[Leetcode]23. Merge k Sorted Lists @python

题目Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.题目要求将k个有序的列表组合成一个大的有序列表,并分析实现的复杂度解题思路此题参考kitt blog...
  • qian2729
  • qian2729
  • 2016-01-16 15:32
  • 544

LeetCode 23: Merge K Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 本题在上一题(LeetCode 21: Merge Two So...
  • sunao2002002
  • sunao2002002
  • 2015-05-31 02:04
  • 3429

Merge k Sorted Lists -- LeetCode

原题链接: http://oj.leetcode.com/problems/merge-k-sorted-lists/  这道题目在分布式系统中非常常见,来自不同client的sorted list要在central server上面merge起来。这个题目一般有两种做法,下面一...
  • linhuanmars
  • linhuanmars
  • 2014-02-25 09:45
  • 26084

[LeetCode] 023. Merge k Sorted Lists (Hard) (C++/Java/Python)

[LeetCode] 023. Merge k Sorted Lists (Hard) (C++/Java/Python)
  • hcbbt
  • hcbbt
  • 2015-03-05 11:19
  • 2552

K链表合并 Merge k Sorted Lists

思想:分布式常见题型。 刚开始的思路:逐一合并,合并的时间复杂度用O(N) ——> TLE ListNode *mergeKLists(vector &lists) { if( lists.size() == 0) return nullptr; ...
  • yeruby
  • yeruby
  • 2015-04-20 20:05
  • 2947

LeetCode 23 Merge k Sorted Lists(合并K个已排序链表)

翻译合并K个已排序的链表,并且将其排序并返回。 分析和描述其复杂性。原文Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.代码我们采用分治的方法来解决这个...
  • NoMasp
  • NoMasp
  • 2015-11-12 17:30
  • 3382

LeetCode Merge K Sorted Lists 问题和解答程序 C++ priority queue实现方法

到了现在这种题居然变得这么简单了,实现第二种方法感觉就像势如破竹,一下子通过了。 这种经典的合并程序,基本上可以一口气写出来了,还可以任意变换。以前是不敢想象。 不过这个跟某些网上的所谓达到盲打有点不一样。 我觉得这样的水平不是死背出来的,而是通过做题,然后熟悉基本方法和操作达到的。
  • kenden23
  • kenden23
  • 2013-10-28 15:39
  • 2913

leetcode -- Merge k Sorted Lists -- 重点有trick

https://leetcode.com/problems/merge-k-sorted-lists/思路就是把所有的head节点入heap,然后把root,heappop出来。再把被pop出来的node所属于的list的下一个node入heap. 知道heap为空这里要用到heap,python中...
  • xyqzki
  • xyqzki
  • 2015-12-11 16:01
  • 356
    个人资料
    • 访问:26404次
    • 积分:944
    • 等级:
    • 排名:千里之外
    • 原创:58篇
    • 转载:70篇
    • 译文:1篇
    • 评论:1条