1. 程式人生 > >Leetcode做題日記:23. 合併K個排序連結串列(PYTHON)

Leetcode做題日記:23. 合併K個排序連結串列(PYTHON)

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。
示例:
輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6

        b=[]
        ss=ListNode(0)
        LL=ss
        for i in lists:
            a=ListNode(0)
            a.next=i
            a=a.next #指向當前輸入的第一個值
            while
a !=None: b.append(a.val) a=a.next #操作完之後記得更新當前指向節點的位置 b.sort() #排序 for i in b: #建立新的連結串列 ''' ss=ss.next bb=ListNode(i) ss=bb #錯在:ss時一個連結串列,不可能賦值節點 ''' #上面這裡使用連結串列方式錯誤,下面的這三行才是正確的 bb=
ListNode(i) ss.next=bb ss=ss.next #指向當前bb這個節點 return LL.next #我直接把所有連結串列的所有值加入到一個列表中,直接排序,最後把排序的列表依次輸入到新的連結串列中 #竟然只要76ms,特別注意連結串列的賦值與最後返回的是什麼 #下面是我第一次的程式碼,我的想法是利用之前對兩個連結串列的排序程式碼,對lists重所有連結串列執行 #這個操作,程式碼正確,但是最後超時了。複雜度有點高? def HB(l1,l2): L1=ListNode(
0) L1.next=l1 L2=ListNode(0) L2.next=l2 l3=ListNode(0) LL=l3 s1=L1 s2=L2 if L1.next == None: return l2 if L2.next == None: return l1 s1=s1.next s2=s2.next while s1 != None or s2 !=None: if s1==None: l3.next=s2 break if s2==None: l3.next=s1 break if s1.val <=s2.val: L4=ListNode(s1.val) l3.next=L4 l3=l3.next s1=s1.next continue if s1.val >s2.val: L4=ListNode(s2.val) l3.next=L4 l3=l3.next s2=s2.next return LL.next #上面的是之前的程式碼 L=len(lists) if L==1: return lists[0] if L==0: return [] ss=HB(lists[0],lists[1]) for i in lists[2:]: ss=HB(ss,i) return ss