Leetcode 148 Sort List

Given the head of a linked list, return the list after sorting it in ascending order.


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

image
  • Soruda bizden karışık olarak verilen linked listi küçükten büyüğe doğru sıralamamız isteniyor.
  • Bunun için mergesort sıralamasını kullanabiliriz.T.C. nlogn dir.
  • Mergesort için linkedlist ortadan ikiye bölüp iki yeni liste oluştururuz.Ve bu listeleri kendi içinde tekrar küçükten büyüğe sıralarız.
  • Yani rekürsif olarak sortList fonksiyonunu tekrar ,tekrar çağırırız.
  • Son olarakta merge fonksiyonu ile bölünmüş listeleri birleştiririz.
class Solution:
    def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head or not head.next:
            return head
        
        #listeyi ikiye bölelim
        left = head
        right = self.getMid(head)
        tmp = right.next
        right.next = None
        right = tmp
        
        left = self.sortList(left)
        right = self.sortList(right)
        return self.merge(left,right)
    
    def getMid(self,head):
        slow,fast = head, head.next
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        return slow
    
    def merge(self,list1,list2):
        tail = dummy = ListNode()
        while list1 and list2:
            if list1.val<list2.val:
                tail.next = list1
                list1 = list1.next
            else:
                tail.next = list2
                list2 = list2.next
            tail = tail.next
        if list1:
            tail.next = list1
        if list2:
            tail.next = list2
        return dummy.next