Leetcode 25 Reverse Nodes in k-Group

Soru

Given the head of a linked list, reverse the nodes of the list k at a time, and return the modified list.

k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes, in the end, should remain as it is.

You may not alter the values in the list’s nodes, only nodes themselves may be changed.

Follow-up: Can you solve the problem in O(1) extra memory space?

Örnek 1

image
Input: head = [1,2,3,4,5], k = 2 Output: [2,1,4,3,5]

Örnek 2

image
Input: head = [1,2,3,4,5], k = 3 Output: [3,2,1,4,5]

Çözüm

  • “25. Reverse Nodes in k-Group” sorusu, verilen bir bağlı listeyi her k düğümde gruplayarak ters çevirme işlemini gerçekleştirmenizi ister. Bu problemde, bağlı liste boyunca ilerlerken her k düğüm tersine çevrilmeli ve k’ya tam bölünmeyen son grup olduğu gibi bırakılmalıdır.
  • Girdi: Tek yönlü bir bağlı listenin baş düğümü (head) ve bir tam sayı k.
  • Çıktı: Bağlı listenin her k düğümünde tersine çevrilmiş hali.
  • Bu problemi çözmek için, liste boyunca ilerleyip her k düğüm için ters çevirme işlemi yapabiliriz. Bunun için iki aşamalı bir yaklaşım kullanılır: ilk olarak, verilen k boyutunda bir grubun tamamının tersine çevrilebilir olup olmadığını kontrol etmek, ardından bu grubu tersine çevirmek.
  • Çalışma Mekanizması:
  • Grubun Ters Çevrilebilirliğini Kontrol Et: Her grup için, grup boyunca ilerleyip k düğüme ulaşılıp ulaşılamayacağını kontrol eder.
  • Grubu Ters Çevirme: Grup ters çevrilebilir ise, o grubu yerinde ters çevirir.
  • Listeyi Yeniden Bağla: Ters çevrilen grubun başını ve sonunu, ana listeye bağlar.
  • Sonraki Gruba Geçiş: İşlem, liste sonuna kadar veya bir grup k düğümden kısa olduğunda durdurulur.

Code

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

class Solution:
    def reverseKGroup(self, head, k):
        # Grup ters çevrilebilir mi kontrol et
        def canReverse(start, k):
            count = 0
            while start and count < k:
                start = start.next
                count += 1
            return count == k
        
        # Verilen başlangıçtan itibaren k düğümü ters çevir
        def reverse(start, k):
            prev, curr = None, start
            for _ in range(k):
                next_temp = curr.next
                curr.next = prev
                prev = curr
                curr = next_temp
            return prev
        
        dummy = ListNode(0, head)
        prev_group_end = dummy
        
        while canReverse(prev_group_end.next, k):
            kth = prev_group_end
            # k'inci düğümü bul
            for _ in range(k):
                kth = kth.next
            group_next = kth.next
            # k düğümü ters çevir
            new_start = reverse(prev_group_end.next, k)
            # Ters çevrilen grubu listeyle birleştir
            kth = prev_group_end.next
            prev_group_end.next = new_start
            kth.next = group_next
            prev_group_end = kth
            
        return dummy.next




Complexity

  • Time complexity (Zaman Karmaşıklığı): O(n), burada n düğüm sayısıdır. Her düğüm birkaç kez işlenir (kontrol ve ters çevirme işlemleri).
  • Space complexity (Alan Karmaşıklığı): O(1), çünkü ek alan kullanılmaz; tüm işlemler mevcut liste üzerinde gerçekleştirilir.