You are given the head of a singly linked-list. The list can be represented as:
L0 → L1 → … → Ln - 1 → Ln
Reorder the list to be on the following form:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
You may not modify the values in the list’s nodes. Only nodes themselves may be changed.
Örnek 1
Input: head = [1,2,3,4]
Output: [1,4,2,3]
Örnek 2
Input: head = [1,2,3,4,5]
Output: [1,5,2,4,3]
Çözüm
Verilen bir tek yönlü bağlı listenin düğümlerini özel bir sırayla yeniden düzenlemenizi ister. Bu problemde, listenin ilk elemanını son eleman, ikinci elemanı sondan ikinci eleman ve bu şekilde devam edecek biçimde yeniden düzenlenmesi gerekiyor.
Girdi: Tek yönlü bir bağlı listenin baş düğümü (head).
Çıktı: Düğümler yukarıda açıklanan sırayla yeniden düzenlenmiş liste. Fonksiyon dönüş değeri olmadan listeyi yerinde (in-place) değiştirmelidir.
Çalışma Mekanizması:
Listeyi Ortadan Bölmek: Hızlı ve yavaş işaretçiler kullanılarak liste ortadan ikiye bölünür. Hızlı işaretçi her adımda iki düğüm, yavaş işaretçi bir düğüm ilerler.
Listeyi Ters Çevirmek: İkinci yarının başlangıcından itibaren liste sonuna kadar düğümler ters çevrilir.
Listeleri Birleştirmek: İlk liste ile tersine çevrilmiş ikinci liste, özellikle belirtilen sırayla birleştirilir. Bu işlem sırasında, birinci listeden bir düğüm, ikinci listeden bir düğüm şeklinde ilerlenir.
Code
classListNode:def__init__(self,val=0,next=None):self.val=valself.next=nextclassSolution:defreorderList(self,head):ifnothead:return# Adım 1: Orta noktayı bulslow,fast=head,headwhilefastandfast.next:slow=slow.nextfast=fast.next.next# Adım 2: İkinci yarısını ters çevirprev,curr=None,slowwhilecurr:next_temp=curr.nextcurr.next=prevprev=currcurr=next_temp# Adım 3: İki listeyi birleştirfirst,second=head,prevwhilesecond.next:temp1,temp2=first.next,second.nextfirst.next=secondsecond.next=temp1first,second=temp1,temp2
Complexity
Time complexity (Zaman Karmaşıklığı): O(n), burada n bağlı listenin düğüm sayısıdır. Listenin ortasını bulmak, ikinci yarısını tersine çevirmek ve listeleri birleştirmek lineer zaman alır.
Space complexity (Alan Karmaşıklığı): O(1), çünkü ek alan kullanılmaz; tüm değişiklikler mevcut liste üzerinde yerinde gerçekleştirilir.