合并k个已排序的链表
2015-07-09 17:43
417 查看
最先想到的是把两个linked lists 合并成一个。
这样从第一个开始一个一个吞并,直到所有list都被合并。
但是,所花费的时间代价太长,不通过。
方法2, 分治 递归, 借助于
通过。
假设kk个已排序了的链表,每个链表的长度为nn;
“方法1”,完成所有的合并的时间复杂度为O(nk2)=O((n+n)+(2n+n)+...+((k−1)n+n))=O((k−1)∗kn/2+(k−1)n)O(nk^2)=O((n+n)+(2n+n)+...+((k-1)n+n))=O((k-1)*kn/2+(k-1)n)
“方法2”,每次递归的时候总共需要比较O(nk)O(nk)次,一共log(k)log(k)次递归,所以算法复杂度为O(nklog(k))O(nklog(k))
这样从第一个开始一个一个吞并,直到所有list都被合并。
class ListNode:# Definition for singly-linked list. def __init__(self, x): self.val = x self.next = None class Solution: # @param {ListNode[]} lists # @return {ListNode} def mergeKLists_0(self, lists): #方法1 lists = [list for list in lists if list is not None] if len(lists)<=0: return lists l=lists[0] for i in range(1,len(lists)): l=self.merge2lists(l,lists[i]) return l def merge2lists(self,list_1,list_2): # merge 2 linked list if list_1 is None: return list_2 if list_2 is None: return list_1 if list_1.val>=list_2.val: head_1=list_1 #big head=head_2=list_2 #small else: head_1=list_2 #big head=head_2=list_1 #small while head_2.next!=None: if head_2.next.val>head_1.val: head_2.next,head_1=head_1,head_2.next head_2=head_2.next if head_1!=next: head_2.next=head_1 return head
但是,所花费的时间代价太长,不通过。
方法2, 分治 递归, 借助于
mergesort的思想。
def mergeKLists(self, lists): lists = [list for list in lists if list is not None] if len(lists)<=0: return lists if len(lists)==1: return lists[0] d=[] for i in range(0,len(lists)-1,2): l=self.merge2lists(lists[i],lists[i+1]) d.append(l) if len(lists)%2==1: d.append(lists[len(lists)-1]) return self.mergeKLists(d)
通过。
merge2lists(n,m)平均需要比较(m+n)/2(m+n)/2 即O(n+m)O(n+m);
假设kk个已排序了的链表,每个链表的长度为nn;
“方法1”,完成所有的合并的时间复杂度为O(nk2)=O((n+n)+(2n+n)+...+((k−1)n+n))=O((k−1)∗kn/2+(k−1)n)O(nk^2)=O((n+n)+(2n+n)+...+((k-1)n+n))=O((k-1)*kn/2+(k-1)n)
“方法2”,每次递归的时候总共需要比较O(nk)O(nk)次,一共log(k)log(k)次递归,所以算法复杂度为O(nklog(k))O(nklog(k))
相关文章推荐
- delphi 完全控制Excel 文件
- putty或xshell上用vi/vim小键盘无法使用的解决方法
- Panabit精简版安装手册
- IOS 微信分享到朋友圈(ios自学笔记)
- MYSQL 启动错误193
- 配置描述文件mobileconfig的生成及注意事项
- 手斧Linux – 从LFS到Funtoo (135)
- Objective-C(十七、KVC键值编码及实例说明)——iOS开发基础
- 小牟Andorid下面MD5具体实现的思路总结
- EXCEL 建立工作薄与工作表
- Myeclipse实用快捷键总结
- POJ-3087-Shuffle'm Up
- sql server 2008 故障转移群集
- IOS设备MDM证书申请流程
- 比较实用的几个网站收藏 不定期更新
- 手斧Linux – 从LFS到Funtoo (134)
- VS2012通过ThoughtWorks-GO自动构建出现error MSB4018问题
- RichTextBox设置颜色。因为页面的光标移动后,显示的颜色变成黑色。
- ZooKeeper实践方案:(7) 分布式锁
- 手机移动端alert替换方案