[LeetCode]Merge k Sorted Lists
来源:互联网 发布:知科地方门户网站系统 编辑:程序博客网 时间:2024/06/07 04:36
Question:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
本题难度为hard。
刚开始我的思路是取出两条,用merge2Lists的方法合并为一条,再将这条和下一条用merge2Lists来合并为一条,以此类推。这种方法的结果就是超时。下面对其时间复杂度进行分析:
假设有K个list,每个list的平均长度为n 由于每次合并后,都会在原有长度基础上增加n。设第i次合并前,两个list长度分别是i*n,n。那么本次的复杂度就是i*n+n。(按最坏情况:一个list包含另一个list,且二者的最大值紧邻) 那么总时间复杂度=O(2n+3n+…+kn), 为O(nk²)
public class Solution { public ListNode mergeKLists(ListNode[] lists) { //require int size=lists.length; if(size==0||lists==null) return null; //invariant ListNode l1=lists[0],l2; for(int i=1;i<size;i++){ l2=lists[i]; l1=merge2Lists(l1,l2); } //ensure return l1; } public ListNode merge2Lists(ListNode l1,ListNode l2){ while(true){ 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; } } }}
第二种方法就是分治算法。时间复杂度为O(nklogk),AC过。
时间复杂度分析参考:leetcode——Merge k Sorted Lists
public class Solution { public ListNode mergeKLists(ListNode[] lists) { //require int size=lists.length; if(size==0||lists==null) return null; //invariant return divide(lists,0,size-1); } public ListNode divide(ListNode[] lists,int l,int r){ int size=r-l+1; if(size==1) return lists[l]; if(size==2) return merge2Lists(lists[l],lists[r]); //divide,后序遍历 return merge2Lists(divide(lists,l,l+size/2),divide(lists,l+size/2+1,r)); } public ListNode merge2Lists(ListNode l1,ListNode l2){ while(true){ 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; } } }}
还有一种方法是利用最小堆。
0 0
- LeetCode: Merge k Sorted Lists
- LeetCode Merge k Sorted Lists
- LeetCode: Merge k Sorted Lists
- [Leetcode] Merge k Sorted Lists
- [Leetcode] Merge k Sorted Lists
- [Leetcode] Merge K sorted lists
- [LeetCode]Merge k Sorted Lists
- [LeetCode] Merge k Sorted Lists
- LeetCode-Merge k Sorted Lists
- LeetCode: Merge k Sorted Lists
- LeetCode - Merge k Sorted Lists
- LeetCode | Merge k Sorted Lists
- 【leetcode】Merge k Sorted Lists
- Leetcode: Merge k Sorted Lists
- <Leetcode>Merge k Sorted Lists
- [LeetCode] Merge K sorted lists
- [LeetCode] Merge k Sorted Lists
- 【Leetcode】Merge k Sorted Lists
- 简单的XML文档读取
- 记事本编写java程序
- 0-1背包 (动态规划)
- 【4002】括号序列
- Android -Toast源码解析
- [LeetCode]Merge k Sorted Lists
- leetcoed90. Subsets II(集合子集去重)
- 简单的Socket 编程 服务端和客户端 (封装)
- 设计模式之创建型模式——简单工厂(又称为静态工厂不属于GOF23种设计模式以内)
- 笔记
- Android-Snackbar用法及源码分析
- C++ 类型转换
- C与C++面试易出知识点
- JAVA通过身份证号码获取身份、年月、性别、校验码信息