k adet sıralı bağlı listeyi tek bir sıralı listede birleştirin (Merge k Sorted Lists).

Cevap

En verimli yaygın çözüm min-heap kullanmaktır: heap'te her listenin o anki başı bulunur; en küçüğü çıkarıp sonuca ekler, aynı listenin bir sonraki düğümünü heap'e koyarız. Heap boyutu en fazla k olduğu için her işlem O(log k)'dir.

import heapq

class ListNode:
    def __init__(self, val=0, next=None):
        self.val, self.next = val, next

def merge_k_lists(lists):
    heap = []
    for i, node in enumerate(lists):
        if node:
            heapq.heappush(heap, (node.val, i, node))  # i: eşitlikte karşılaştırma için
    dummy = tail = ListNode()
    while heap:
        _, i, node = heapq.heappop(heap)
        tail.next = node
        tail = node
        if node.next:
            heapq.heappush(heap, (node.next.val, i, node.next))
    return dummy.next

Neden tuple'a i ekliyoruz?

İki düğümün değeri eşitse Python tuple'ın ikinci elemanını karşılaştırır. ListNode nesneleri karşılaştırılamadığı için TypeError alınır; benzersiz i bunu engeller.

Yaklaşımların karşılaştırması (N toplam düğüm)

YöntemZamanEk bellek
Hepsini diziye at, sırala, liste kurO(N log N)O(N)
Listeleri tek tek sırayla birleştirO(k x N)O(1)
Min-heapO(N log k)O(k)
Divide and conquer (ikişer ikişer birleştir)O(N log k)O(1) iteratif

Divide and conquer

İki sıralı listeyi birleştirme (Merge Two Sorted Lists) fonksiyonunu yazıp listeleri merge sort gibi çiftler halinde birleştirirsiniz; log k tur yapılır, her turda toplam N düğüm işlenir.

Gerçek hayattaki karşılığı

Veritabanlarında ve büyük veri işlemede external merge sort: belleğe sığmayan veri parçalar halinde sıralanıp diske yazılır, sonra k-way merge ile birleştirilir.

  1. Binary search'ün zaman karmaşıklığı nedir ve neden?KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  2. Two Sum: toplamı hedefe eşit olan iki elemanın indekslerini bulun.KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  3. Bir parantez dizisinin geçerli olup olmadığını kontrol edin: "({[]})"KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  4. Tek yönlü bağlı listeyi ters çevirin.OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  5. BFS ve DFS arasındaki fark nedir? Hangisini ne zaman kullanırsınız?OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  6. get ve put işlemleri O(1) olan bir LRU Cache tasarlayın.ZorAlgoritmalar & Veri YapılarıYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle