leetcode 14 合併k個排序鍊錶

2022-06-13 03:51:13 字數 2839 閱讀 1103

合併 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 比較乙個字串陣列的最長公共字首,遍歷整個字串陣列,建立乙個字串用來儲存當前最長公共字串,逐個比較,不斷更新公共字串內容。情況比較多,考慮周全,不然可能會陣列溢位。公共字串的長度和當前比較字串的長度大小的比較,避免陣列越界,還有空字串的...