Мой вопрос связан с выяснением различных способов слияния 2 отсортированных элементов? Я пытаюсь найти простой способ объединить 2 отсортированных элемента.
def merge(arr1, arr2):
return sorted(arr1 + arr2)
# Example: merge([1, 4, 7], [2, 3, 6, 9]) => [1, 2, 3, 4, 6, 7, 9]
Я не уверен, что я усложняю это. Это использует встроенную функцию, что означает, что сложнее испортить детали реализации.
Я также обнаружил, что могу использовать функцию merge() из cypthon heapq.
Удивительно, если подумать об использовании другого метода, например:
его до вас, какую реализацию вы используете. Рассмотрение вопроса о том, нужен ли вам чистый код или требуется производительность.
Для чистого кода вы можете использовать:
оба из них со сложностью O (nlogn)
тогда как эта реализация - https://gist.github.com/Jeffchiucp/9dc2a5108429c4222fe4b2a25e35c778 с сложностью алгоритма O (n).
использовать слияние с heapq
>>> l1 = [1, 4, 7]
>>> l2 = [2, 3, 6, 9]
>>> from heapq import merge
>>> list(merge(l1,l2))
[1, 2, 3, 4, 6, 7, 9]
Вы не хотите объединять два отсортированных списка и сортировать их снова, это не нужно. Существуют алгоритмы O(n)
для объединения отсортированных списков, ваш алгоритм будет O(n log n)
из-за сортировки снова. Объединение двух отсортированных списков с использованием Priority queue
взятой здесь:
from Queue import PriorityQueue
class Solution(object):
def mergeKLists(self, lists):
dummy = ListNode(None)
curr = dummy
q = PriorityQueue()
for node in lists:
if node: q.put((node.val,node))
while q.qsize()>0:
curr.next = q.get()[1]
curr=curr.next
if curr.next: q.put((curr.next.val, curr.next))
return dummy.next