合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。
示例:
#輸入:
[ 1->4->5,
1->3->4,
2->6
]#輸出:
1->1->2->3->4->4->5->6
在k個鍊錶中找到乙個比較節點,然後把k個鍊錶分成兩部分,一部分都比比較節點小,一部分都比比較節點大,然後遞迴。
但是時間太慢了,原因乙個是,找到的比較節點越靠近中位數越好,但是不好操作,第二個就是分成兩部分的時候要查詢,只能順序查詢。(變成陣列也許會好一點,二分)
import random
class solution:
def mergeklists(self, lists)-> listnode:
lists = [list for list in lists if list is not none]
if len(lists)==0:
return none
num = len(lists)
i = random.randint(0,num-1)
com_node = lists[i]
com_val = lists[i].val
lists[i] = lists[i].next
lists_1 =
for j in range(num):
if i!=j:
head = lists[j]
tail = none
while lists[j].val<=com_val:
tail = lists[j]
lists[j] = lists[j].next
if lists[j] is none:
break
if tail is not none:
tail.next = none
list_1 = self.mergeklists(lists_1)
list_2 = self.mergeklists(lists)
if list_1 is not none:
head = list_1
while true:
if list_1.next is not none:
list_1 = list_1.next
else:
list_1.next = com_node
break
else:
head = com_node
com_node.next = list_2
return head
每次合併兩個鍊錶,合併一次之後剩餘k/2,再合併一次剩餘k/4。時間複雜度(nlogk)
class solution(object):
def mergeklists(self, lists):
""":type lists: list[listnode]
:rtype: listnode
"""amount = len(lists)
interval = 1
while interval < amount:
for i in range(0, amount - interval, interval * 2):
lists[i] = self.merge2lists(lists[i], lists[i + interval])
interval *= 2
return lists[0] if amount > 0 else lists
def merge2lists(self, l1, l2):
head = point = listnode(0)
while l1 and l2:
if l1.val <= l2.val:
point.next = l1
l1 = l1.next
else:
point.next = l2
l2 = l1
l1 = point.next.next
point = point.next
if not l1:
point.next=l2
else:
point.next=l1
return head.next
from queue import priorityqueue
class listnode:
def __init__(self, x):
self.val = x
self.next = none
def __lt__(self, other):
return self.valclass solution(object):
def mergeklists(self, lists):
""":type lists: list[listnode]
:rtype: listnode
"""head = point = listnode(0)
q = priorityqueue()
for l in lists:
if l:
q.put((l.val, l))
while not q.empty():
val, node = q.get()
point.next = listnode(val)
point = point.next
node = node.next
if node:
q.put((node.val, node))
return head.next
leetcode(14)最長字首
14.最長公共字首 這個題目是在多個字串中尋找最長公共字首。解體思路有點像氣泡排序的方法,將第乙個字串當成最長字首串,和第二個字串判斷找出最長字首串,這個最長字首串又和第三個字串判斷,找到新的最長字首串,以此類推,中途如果出現比較不相等的情況,如果是第乙個字元不相等,則直接返回 否則結束比較,當前找...
分治實現LeetCode 23題 合併K個排序鍊錶
紀念第一道沒有看題解做出來的困難題 分治思想 歸併排序實現合併k個排序鍊錶 由於是實現一連串已經排序的鍊錶,所以第一時間想到了歸併排序 又由於是實現多個鍊錶的總排序,為了減少時間複雜度又想到了分治思想,這一題中也就是二分法 做了這麼多天的題總算有點進步 class solution 結果陣列的頭結點...
LeetCode14最長公共字首
編寫乙個函式來查詢字串陣列中最長的公共字首字串。例如 輸出 ab 比較乙個字串陣列的最長公共字首,遍歷整個字串陣列,建立乙個字串用來儲存當前最長公共字串,逐個比較,不斷更新公共字串內容。情況比較多,考慮周全,不然可能會陣列溢位。公共字串的長度和當前比較字串的長度大小的比較,避免陣列越界,還有空字串的...