Leetcodeアルゴリズム——23、複数のチェーンテーブルを結合する
k個の秩序チェーンテーブルを結合し、新しい秩序チェーンテーブルを返します.
例:Input:[1->4->5,1->3->4,2->6]Output:1->1->2->3->4->4->5->6
構想
集計ソートを使用すると、Leetcodeアルゴリズムである21、2つの順序付きチェーンテーブルのマージと同様の考え方になります.
k個のポインタを維持し、k個の数の最小数を抽出するたびに、このポインタ+1をループします.
優先キュー(最小スタック)を用いて,抽出されるたびに最小数の複雑度をO(k)からO(logk)に変える.
全体時間複雑度はO(nlogk)であった.
python実装
例:Input:[1->4->5,1->3->4,2->6]Output:1->1->2->3->4->4->5->6
構想
集計ソートを使用すると、Leetcodeアルゴリズムである21、2つの順序付きチェーンテーブルのマージと同様の考え方になります.
k個のポインタを維持し、k個の数の最小数を抽出するたびに、このポインタ+1をループします.
優先キュー(最小スタック)を用いて,抽出されるたびに最小数の複雑度をO(k)からO(logk)に変える.
全体時間複雑度はO(nlogk)であった.
python実装
class ListNode:
def __init__(self, x):
if isinstance(x, list):
self.val = x[0]
self.next = None
head = self
for i in range(1, len(x)):
head.next = ListNode(x[i])
head = head.next
else:
self.val = x
self.next = None
def output(self):
'''
'''
result = str(self.val)
head = self.next
while(head is not None):
result += f' -> {head.val}'
head = head.next
return '(' + result + ')'
def mergeKLists(lists):
"""
:type lists: list[ListNode]
:rtype: ListNode
"""
from queue import PriorityQueue
#
head = ListNode(0)
p = head
#
q = PriorityQueue()
for l in lists:
if l:
q.put((l.val, id(l), l))
# id(l) , l.val , 。
# l, , ListNode
# id(l) l ,int , id 。
#
while(not q.empty()):
val, _, node = q.get()
p.next = ListNode(val)
p = p.next
node = node.next
if node:
q.put((node.val, id(node), node))
return head.next
if '__main__' == __name__:
lists = []
lists.append(ListNode([1,4,5]))
lists.append(ListNode([1,3,4]))
lists.append(ListNode([2,6]))
print(mergeKLists(lists).output())