Leetcode 021 Merge Two Sorted Lists

Soru

Merge two sorted linked lists and return it as a sorted list. The list should be made by splicing together the nodes of the first two lists.

Örnek 1

image
Input: l1 = [1,2,4], l2 = [1,3,4]
Output: [1,1,2,3,4,4]

Örnek 2

Input: l1 = [], l2 = []
Output: []

Örnek 3

Input: l1 = [], l2 = [0]
Output: [0]

Çözüm

  • İki sıralı bağlı listeyi birleştirmenizi ve tek sıralı bir bağlı liste oluşturmanızı ister. Bu problem, iki sıralı bağlı listenin elemanlarını küçükten büyüğe doğru birleştirerek yeni bir sıralı liste oluşturmayı gerektirir.
  • Girdi: İki sıralı tek yönlü bağlı liste başı l1 ve l2.
  • Çıktı: l1 ve l2’nin elemanları ile oluşturulan yeni sıralı tek yönlü bağlı liste.
  • Bu problem yinelemeli (iterative) veya özyinelemeli (recursive) yöntemlerle çözülebilir. Her iki yöntem de, iki listenin başlarından başlayarak karşılaştırmalar yapar ve daha küçük olan düğümü sonuç listesine ekler.
  • Çalışma Mekanizması:
  • Yinelemeli Yöntem:
  • İki liste başından itibaren elemanları karşılaştırır.
  • Daha küçük olan düğümü yeni listeye ekler ve ilgili listenin başını bir sonraki düğüme taşır.
  • Karşılaştırma bittiğinde, kalan elemanları yeni listeye ekler.
  • Özyinelemeli Yöntem:
  • l1’in değeri l2’den büyükse, l1 ve l2 yer değiştirir.
  • Daha küçük düğüm (l1), l1.next ile kendisinden sonra gelenleri özyinelemeli olarak birleştirmeye devam eder.

Code

  • Yinelemeli Çözüm Python Kodu:

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

class Solution:
    def mergeTwoLists(self, l1, l2):
        dummy = ListNode()  # Yeni liste için dummy baş düğüm
        tail = dummy

        while l1 and l2:
            if l1.val < l2.val:
                tail.next = l1
                l1 = l1.next
            else:
                tail.next = l2
                l2 = l2.next
            tail = tail.next

        # Kalan elemanları ekleyin
        tail.next = l1 if l1 else l2

        return dummy.next

  • Özyinelemeli Çözüm Python Kodu:

class Solution:
    def mergeTwoLists(self, l1, l2):
        if not l1 or (l2 and l1.val > l2.val):
            l1, l2 = l2, l1  # l1 her zaman daha küçük veya eşit elemanı göstermeli
        if l1:
            l1.next = self.mergeTwoLists(l1.next, l2)
        return l1


Complexity

  • Time complexity Zaman Karmaşıklığı: Her iki yöntem için de O(n+m), burada n ve m iki bağlı listenin uzunluklarıdır.
  • Space complexity Alan Karmaşıklığı: Yinelemeli yöntem için O(1), çünkü ekstra alan kullanılmaz. Özyinelemeli yöntem için O(n+m), çünkü her çağrı için çağrı yığınında bir kayıt tutulur.