Leetcode做題日記:23. 合併K個排序連結串列(PYTHON)
阿新 • • 發佈:2019-01-01
合併 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