Leetcode 23 Merge k Sorted Lists

Soru

You are given an array of k linked-lists lists, each linked-list is sorted in ascending order.

Merge all the linked-lists into one sorted linked-list and return it.

Örnek 1

Input: lists = [[1,4,5],[1,3,4],[2,6]]
Output: [1,1,2,3,4,4,5,6]
Explanation: The linked-lists are:
[
  1->4->5,
  1->3->4,
  2->6
]
merging them into one sorted list:
1->1->2->3->4->4->5->6

Örnek 2

Input: lists = []
Output: []

Örnek 3

Input: lists = [[]]
Output: []

Çözüm

  • “23. Merge k Sorted Lists” sorusu, birden fazla sıralı bağlı listenin tek bir sıralı bağlı listeye birleştirilmesini ister. Bu problem, verilen k sıralı bağlı listenin tüm elemanlarını içeren tek bir sıralı bağlı liste oluşturmayı gerektirir ve bu liste de sıralı olmalıdır.
  • Girdi: ListNode türünde k tane sıralı bağlı listenin baş düğümleri (lists).
  • Çıktı: Bu listelerin elemanlarını içeren tek bir sıralı bağlı liste.
  • Bu problem birkaç farklı yöntemle çözülebilir:
  • Min-Heap (Öncelikli Kuyruk) Kullanarak:
  • Her listenin baş düğümünü bir min-heap’e ekleyin.
  • Heap’ten en küçük düğümü çıkarın, sonuca ekleyin ve bu düğümün next düğümünü heap’e ekleyin.
  • Bu işlemi tüm düğümler işlenene kadar devam ettirin.
  • İki Listeyi Birleştirme Yöntemiyle:
  • mergeTwoLists fonksiyonu kullanarak iki listeyi adım adım birleştirin.
  • Bu işlemi tüm listeler tek bir liste kalana kadar devam ettirin.
  • D&C (Böl ve Yönet) Yaklaşımı:
  • Listenin ortasından bölün, iki yarıyı ayrı ayrı birleştirin.
  • İki yarının sonuçlarını tekrar birleştirin.
  • Çalışma Mekanizması:
  • Heap İnitializasyonu: İlk olarak, her listenin baş düğümü (eğer boş değilse) bir heap’e (öncelikli kuyruk) eklenir.
  • Düğüm Çıkarma ve Ekleme: En küçük düğüm heap’ten çıkarılır, sonuç listesine eklenir ve bu düğümün next elemanı, varsa, heap’e eklenir.
  • Sonuç Oluşturma: Bu işlem, tüm düğümler işlenene kadar devam eder ve böylece tüm listeler tek bir sıralı liste olarak birleştirilir.

Code (Min-Heap Yöntemi Kullanılarak)

from heapq import heappush, heappop

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

class Solution:
    def mergeKLists(self, lists):
        head = point = ListNode(0)
        heap = []
        
        # Tüm listelerin baş düğümlerini heap'e ekleyin
        for lidx, l in enumerate(lists):
            if l:
                heappush(heap, (l.val, lidx, l))
        
        # En küçük elemanı bul ve listeye ekle, sonra bir sonraki düğümü heap'e ekle
        while heap:
            val, idx, node = heappop(heap)
            point.next = ListNode(val)
            point = point.next
            node = node.next
            if node:
                heappush(heap, (node.val, idx, node))
        
        return head.next



Complexity

  • Time complexity (Zaman Karmaşıklığı): O(N log k), burada N toplam düğüm sayısı, k ise liste sayısıdır. Her düğüm için heap’e eklemek ve çıkarmak log k zaman alır.
  • Space complexity (Alan Karmaşıklığı): O(k), min-heap’te her zaman en fazla k düğüm bulunur.