合併k個排序鍊錶(Python實現)

2021-09-26 10:42:16 字數 3786 閱讀 2501

題目描述:

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

示例:輸入:

[1->4->5,

1->3->4,

2->6

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

思路要點:

1、匯入鍊錶模組(自定義)

2、使用python自帶的二分排序庫進行排序,可降低時間複雜度

**:

import chaintable as c

import bisect

class solution(c.chaintable):

def __init__(self,lists):

self.lists=lists

self.result=self.mergeklists(self.lists)

def mergeklists(self,lists):

sort_lst=

while true:

flag=0

for i in lists:

if i.isempty():

continue

flag=1

t=i.getitem(0)

bisect.insort(sort_lst,t)

i.delete(0)

if flag==0:

break

sort_chaintable=c.chaintable()

for i in sort_lst:

return sort_chaintable

if __name__=='__main__':

lists=['145','134','26']

for i in range(len(lists)):

temp=lists[i]

lists[i]=c.chaintable()

for j in temp:

print('原鍊錶:\n')

print(lists)

print('\n')

solution=solution(lists)

lst=solution.result

print('排序後:\n')

print(lst)

自定義的python鍊錶:

#用python實現資料結構鍊錶

class node:

'''定義節點類

data:節點儲存的資料

next_node:下乙個節點物件

'''def __init__(self,data,pnext=none):

self.data=data

self.next_node=pnext

def __repr__(self):

'''定義node的字元輸出

print為輸出data

'''return str(self.data)

'''鍊錶類:

屬性:煉表頭:head

鍊錶長度:length

方法:以下

'''class chaintable:

def __init__(self):

self.head=none

self.length=0

'判斷是否為空列表'

def isempty(self):

return self.length==0

'在鍊錶尾增加乙個節點'

item = none

if isinstance(dataornode, node):

item = dataornode

else:

item = node(dataornode)

if not self.head:

self.head=item

self.length+=1

else:

node=self.head

'迴圈至最後乙個節點'

while node.next_node:

node=node.next_node

node.next_node=item

self.length+=1

'刪除乙個節點'

def delete(self,index):

if self.isempty():

print("sorry,the chain table is empty")

return

if index<0 or index>=self.length:

print("error:out of index")

return

if index==0:

self.head=self.head.next_node

self.length-=1

return

index=0

node=self.head

pre_node=self.head

while node.next_node and index=self.length:

print("error:out of index")

return

index=0

node=self.head

while node.next_node and index=self.length:

print("error:out of index")

return

index=0

node=self.head

while node.next_node and index=self.length:

print("error:out of index")

return

item=none

if isinstance(dataornode,node):

item=dataornode

else:

item=node(dataornode)

if index==0:

item.next_node=self.head

self.head=item

self.length+=1

return

index=0

node=self.head

prev=self.head

while node.next_node and index'

node=node.next_node

else:

nlist+=str(node.data)

node=node.next_node

return nlist

def __getitem__(self, ind):

if self.isempty() or ind < 0 or ind >= self.length:

print("error: out of index")

return

return self.getitem(ind)

def __setitem__(self, ind, val):

if self.isempty() or ind < 0 or ind >= self.length:

print("error: out of index")

return

self.update(ind, val)

def __len__(self):

return self.length

執行結果:

原鍊錶:

[1->4->5, 1->3->4, 2->6]

排序後:

1->1->2->3->4->4->5->6

合併k個排序鍊錶

合併k個排序鍊錶,並且返回合併後的排序鍊錶。嘗試分析和描述其複雜度。樣例 給出3個排序鍊錶 2 4 null,null,1 null 返回 1 2 4 null 兩兩合併 合併ab得到c 合併cd得到e definition for listnode.public class listnode pu...

合併K個排序鍊錶

從21.合併兩個有序鍊錶的基礎上,我們已經能夠解決兩個有序鍊錶的問題,現在是k個有序鍊錶,我們可以將第一二個有序鍊錶進行合併,然後將新的有序鍊錶再繼續跟第三個有序鍊錶合併,直到將所有的有序鍊錶合併完成。這樣做思路上是可行的,但是演算法的時間複雜度將會很大,具體就不計算了。有興趣的自己計算下。根據思路...

合併K個排序鍊錶

題目 合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 思路 設定乙個堆,每次把每個鍊錶的頭結點放入堆中。記錄每個節點的值與在原陣列中的位置,便於鍊錶往下走。彈出堆中最小值,把最小值所在位置的陣列...