合并k个排序链表(Python实现)
生活随笔
收集整理的這篇文章主要介紹了
合并k个排序链表(Python实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:
合并 k 個排序鏈表,返回合并后的排序鏈表。請分析和描述算法的復雜度。
示例:
輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-k-sorted-lists
思路要點:
1、導入鏈表模塊(自定義)
2、使用python自帶的二分排序庫進行排序,可降低時間復雜度
代碼:
import chaintable as c import bisectclass Solution(c.chainTable):def __init__(self,lists):self.lists=listsself.result=self.mergeKLists(self.lists)def mergeKLists(self,lists):sort_lst=[]while True:flag=0for i in lists:if i.isEmpty():continueflag=1t=i.getItem(0)bisect.insort(sort_lst,t)i.delete(0)if flag==0:breaksort_chaintable=c.chainTable()for i in sort_lst:sort_chaintable.append(i)return sort_chaintableif __name__=='__main__':lists=['145','134','26']for i in range(len(lists)):temp=lists[i]lists[i]=c.chainTable()for j in temp:lists[i].append(j)print('原鏈表:\n')print(lists)print('\n')solution=Solution(lists)lst=solution.resultprint('排序后:\n')print(lst)自定義的python鏈表:
#用python實現數據結構鏈表class Node:'''定義節點類data:節點保存的數據next_node:下一個節點對象'''def __init__(self,data,pnext=None):self.data=dataself.next_node=pnextdef __repr__(self):'''定義Node的字符輸出print為輸出data'''return str(self.data) ''' 鏈表類: 屬性: 鏈表頭:head 鏈表長度:length 方法:以下 ''' class chainTable:def __init__(self):self.head=Noneself.length=0'判斷是否為空列表'def isEmpty(self):return self.length==0'在鏈表尾增加一個節點'def append(self,dataorNode):item = Noneif isinstance(dataorNode, Node):item = dataorNodeelse:item = Node(dataorNode)if not self.head:self.head=itemself.length+=1else:node=self.head'循環至最后一個節點'while node.next_node:node=node.next_nodenode.next_node=itemself.length+=1'刪除一個節點'def delete(self,index):if self.isEmpty():print("Sorry,the chain table is empty")returnif index<0 or index>=self.length:print("Error:out of index")returnif index==0:self.head=self.head.next_nodeself.length-=1returnIndex=0node=self.headpre_node=self.headwhile node.next_node and Index<index:pre_node=nodenode=node.next_nodeIndex+=1if Index==index:pre_node=node.next_nodeself.length-=1'修改一個節點'def update(self,index,data):if self.isEmpty()or index<0 or index>=self.length:print("Error:out of index")returnIndex=0node=self.headwhile node.next_node and Index<index:node=node.next_nodeIndex+=1if Index==index:node.data=data'查找并得到一個節點'def getItem(self,index):if self.isEmpty()or index<0 or index>=self.length:print("Error:out of index")returnIndex=0node=self.headwhile node.next_node and Index<index:node=node.next_nodeIndex+=1return node.data'查找一個節點的索引'def getIndex(self,data):if self.isEmpty():print("Sorry,the chain table is empty")returnIndex=0node=self.headwhile node:if node.data==data:return Indexnode=node.next_nodeIndex+=1if Index==self.length:print("\"%s is not found\",%str(data)")return'插入一個節點'def Insert(self,index,dataorNode):if self.isEmpty():print("Sorry,the chain table is empty")returnif index<0 or index>=self.length:print("Error:out of index")returnitem=Noneif isinstance(dataorNode,Node):item=dataorNodeelse:item=Node(dataorNode)if index==0:item.next_node=self.headself.head=itemself.length+=1returnIndex=0node=self.headprev=self.headwhile node.next_node and Index<index:prev=nodenode=node.next_nodeIndex+=1if Index==index:item.next_node=nodeprev.next_node=itemself.length+=1'清空鏈表'def clear(self):self.head=Noneself.length=0def __repr__(self):if self.isEmpty():return "The chain table is empty"node=self.headnlist=''while node:if node.next_node:nlist+=str(node.data)+'->'node=node.next_nodeelse:nlist+=str(node.data)node=node.next_nodereturn nlistdef __getitem__(self, ind):if self.isEmpty() or ind < 0 or ind >= self.length:print("error: out of index")returnreturn self.getItem(ind)def __setitem__(self, ind, val):if self.isEmpty() or ind < 0 or ind >= self.length:print("error: out of index")returnself.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个排序链表(Python实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像坐标空间变换:透视变换(Perspe
- 下一篇: [python] 基于Dataset库操