Given the head of a linked list, return the list after sorting it in ascending order.
Input: head = [4,2,1,3]
Output: [1,2,3,4]
Input: head = [-1,5,3,4,0]
Output: [-1,0,3,4,5]
Input: head = []
Output: []
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.
classSolution:defsortList(self,head:Optional[ListNode])->Optional[ListNode]:ifnotheadornothead.next:returnhead#listeyi ikiye bölelimleft=headright=self.getMid(head)tmp=right.nextright.next=Noneright=tmpleft=self.sortList(left)right=self.sortList(right)returnself.merge(left,right)defgetMid(self,head):slow,fast=head,head.nextwhilefastandfast.next:slow=slow.nextfast=fast.next.nextreturnslowdefmerge(self,list1,list2):tail=dummy=ListNode()whilelist1andlist2:iflist1.val<list2.val:tail.next=list1list1=list1.nextelse:tail.next=list2list2=list2.nexttail=tail.nextiflist1:tail.next=list1iflist2:tail.next=list2returndummy.next