合併K個排序鏈表
- 2019 年 10 月 5 日
- 筆記
合併K個排序鏈表
0.說在前面1.合併K個排序鏈表2.作者的話
0.說在前面
每周兩篇leetcode刷題,今天本周第二篇,一起來看合併K個排序鏈表,下面一起來實戰吧!
1.合併K個排序鏈表
問題
合併 k 個排序鏈表,返回合併後的排序鏈表。請分析和描述演算法的複雜度。
示例:
輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4->4->5->6
演算法一
【思想】
遍歷k個鏈表,將每個鏈表中的節點值添加到list當中,然後排序,創建新鏈表!
【實現】
def mergeKLists(self, lists): all_list=[] for each in lists: while each: all_list.append(each.val) each=each.next all_list.sort() head=ListNode(0) p=head for i in all_list: p.next=ListNode(i) p=p.next p.next=None p=head.next del head return p
【分析】
假設其中最長鏈表長度為n,則時間複雜度為O(nk),空間複雜度為O(n)。
演算法二
【思想】
兩兩鏈表合併,合併的時候採用遞歸進行合併,直到最後合併成一個鏈表,返回即可!
【實現】
class Solution: def mergeKLists(self, lists): """ :type lists: List[ListNode] :rtype: ListNode """ interval = 1 lists_len = len(lists) while interval<lists_len: for i in range(0,lists_len-interval,interval * 2): lists[i] = self.merge(lists[i], lists[i + interval]); interval *= 2 return lists[0] if len(lists) > 0 else None def merge(self,l1, l2): if l1 is None: return l2 if l2 is None: return l1 if l1.val < l2.val: l1.next = self.merge(l1.next, l2) return l1 else: l2.next = self.merge(l1, l2.next) return l2
【分析】
假設其中最長鏈表長度為n,兩兩合併時間複雜度O(n),每個鏈表遍歷一次O(k)則,時間複雜度為O(nk),空間複雜度為O(1)。