タイトルを見てください
Kは、ソートリストをマージリストを返し組み合わせソート。アルゴリズムの分析と説明を複雑にしてください。
例:
入力:
[
1-> 4 - > 5、
1-> 3-> 4、
2-> 6]
出力:1-> 1-> 2-> 3-> 4-> 4-> 5-> 6
タイトルを取得するためのルールに従って、ソート配列にそれをすべてのデータを取得するには、再び暴力へのすべての最初の、そして、リンクリストに入れます
PS:あまりにも長いコンタクトリストなしで、完成した...ほとんどの次の時間を書くのを忘れて、まだ使用 - >次= - =
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
self.nodes = []
head = point = ListNode(0)
for l in lists:
while l:
self.nodes.append(l.val)
l = l.next
for x in sorted(self.nodes):
point.next = ListNode(x)
point = point.next
return head.next
時間を過ごし224ms
その後、我々は時間アルゴリズムを保存するかを見ます
まずは、リスト際の2つだけを分析してみましょう
私たちは本当にこの問題を持って、検索の上LeetCodeを行ってきました
2は、新たなソートされたリストとリターンにリストを命じました。新しいリストは、二つのリストで構成与えられたモザイク内のすべてのノードです。
例:
入力:1-> 2-> 4、1-> 3-> 4
出力:1-> 1-> 2-> 3-> 4-> 4
それがすでにソートされているので、それは永遠に小選挙次のループ、次回、再度比較、数字のこれら二つのリストを比較する最初の比較的小さいです
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
head = ListNode(0)
point = head
while l1 and l2:
if l1.val <= l2.val:
point.next = l1
l1 = l1.next
else:
point.next = l2
l2 = l2.next
point = point.next
if l1:
point.next = l1
else:
point.next = l2
return head.next
Kは、リンクリストの内部に配置され、あなたも、このアプローチを取ることができ、そのような用語キューのより多くの使用があります
参考:Baiduの優先度キュー。
from Queue import PriorityQueue
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
q = PriorityQueue()
head = point = ListNode(0)
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
それがわずかに速いタイム暴力よりも、192msのにかかる時間
私は、唯一の問題の解決策を参照するために、以下の接続、どのような方法を考えることはできません。
リンク:https://leetcode-cn.com/problems/two-sum/solution/he-bing-kge-pai-xu-lian-biao-by-leetcode/
このアルゴリズムは、ペアごとのマージアルゴリズムが最適化されています。
言っている、私は2つのトピックの二つのリストをマージすることをした方法のラウンドを行うことによってこの問題を考えていないが、直接の最小を聞くことなく、2つのリストのメソッドを(マージします最終リスト内)に直接持ちます= - =
唯一のそれはあまりにも脳死の友人であると言うことができ、また、以下のコードを掲載、今日学びました:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
from Queue import PriorityQueue
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
len_of_lists = len(lists)
if len_of_lists == 0:
return
len_of_next = 1
while len_of_next < len_of_lists:
for i in range(0, len_of_lists - len_of_next, len_of_next*2):
lists[i] = self.merge2Lists(lists[i], lists[i+len_of_next])
len_of_next *= 2
return lists[0]
def merge2Lists(self, l1, l2):
head = point = ListNode(0)
while l1 and l2:
if l1.val <= l2.val:
point.next = ListNode(l1.val)
l1 = l1.next
else:
point.next = ListNode(l2.val)
l2 = l2.next
point = point.next
if l1:
point.next = l1
else:
point.next = l2
return head.next
パターンはわずかに大きくなるようにすると、この質問はまた、最適化された3つの方法が、使用されている、感じは多くのことを学んだ、後で問題を考えます