23 合併K個排序鍊錶

2021-10-01 23:10:45 字數 2339 閱讀 2424

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。

示例:輸入:

[  1->4->5,

1->3->4,

2->6

]輸出: 1->1->2->3->4->4->5->6

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class solution:

def mergeklists(self, lists: list[listnode]) -> listnode:

if len(lists)==0:

return none

if len(lists)==1:

return lists[0]

def mergetwolists(l1: listnode, l2: listnode) -> listnode:

'''兩兩合併

'''#2

if not l1 or not l2:

return l1 if l1 else l2

if l1.val<=l2.val:

head=l1

l1=l1.next

else:

head=l2

l2=l2.next

l3=head

#print (head,l1)

while(l1 and l2):

if l1.val<=l2.val:

l3.next=l1

l1=l1.next

else:

l3.next=l2

l2=l2.next

l3=l3.next

#print(head)

if not l1:

l3.next=l2

elif not l2:

l3.next=l1

return head

res=lists[0]

for i in lists[1:]:

res=mergetwolists(i,res)

return res

主要在迴圈處加了inter作為合併之後的跳躍步數

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class solution:

def mergeklists(self, lists: list[listnode]) -> listnode:

if len(lists)==0:

return none

if len(lists)==1:

return lists[0]

def mergetwolists(l1: listnode, l2: listnode) -> listnode:

'''兩兩合併'''

#2if not l1 or not l2:

return l1 if l1 else l2

if l1.val<=l2.val:

head=l1

l1=l1.next

else:

head=l2

l2=l2.next

l3=head

#print (head,l1)

while(l1 and l2):

if l1.val<=l2.val:

l3.next=l1

l1=l1.next

else:

l3.next=l2

l2=l2.next

l3=l3.next

#print(head)

if not l1:

l3.next=l2

elif not l2:

l3.next=l1

return head

#分治,主要看inter和n之間的配合

inter=1

n=len(lists)

while interfor i in range(0,n-inter,2*inter):

lists[i]=mergetwolists(lists[i],lists[i+inter])

inter*=2

return lists[0]

23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 偷懶直接複製了以前的堆的 所有看上去長了點 class priorityqueue priority是設定優先順序 true為大根堆 false為...

23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。採用分治法的思想,將 k 個排序鍊錶先合併為 k 2 個鍊錶。依次迴圈,直至合併為1個鍊錶為止。注意 從 k 到 k 2 時,如何定義索引,將每兩個鍊錶合併,而且必須符合奇數 偶數個鍊錶的情況。解決辦法 k n 1 2 list...

23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 暴力法 將所有的節點放在乙個陣列中,然後對陣列排序,最後遍歷陣列,組建新的鍊錶。definition for singly linked list...