imashutosh51

Merge Sort for Linked List

Oct 16th, 2022 (edited)
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.04 KB | None | 0 0
  1. #Merge sort for the linked List
  2. class Solution:
  3.    
  4.     def _len(self, head):
  5.         ans = 0
  6.         while head:
  7.             head = head.next
  8.             ans += 1
  9.         return ans
  10.    
  11.     def find_mid(self, head):
  12.         half = self._len(head) // 2
  13.         if half > 0:
  14.             half -= 1  # reducing half by one so it send just before the middle
  15.        
  16.         mid = head
  17.         while half > 0:
  18.             mid = mid.next
  19.             half -= 1
  20.        
  21.         return mid
  22.    
  23.     def merge(self, head, mid):
  24.        
  25.         if not head:
  26.             return mid
  27.         if not mid:
  28.             return head
  29.        
  30.         if head.val < mid.val:
  31.             root = ListNode(head.val)
  32.             head = head.next
  33.         else:
  34.             root = ListNode(mid.val)
  35.             mid = mid.next
  36.        
  37.         cur = root
  38.        
  39.         while head and mid:
  40.             if head.val < mid.val:
  41.                 cur.next = ListNode(head.val)
  42.                 head = head.next
  43.             else:
  44.                 cur.next = ListNode(mid.val)
  45.                 mid = mid.next
  46.            
  47.             cur = cur.next
  48.        
  49.         while head:
  50.             cur.next = ListNode(head.val)
  51.             head = head.next
  52.             cur = cur.next
  53.        
  54.         while mid:
  55.             cur.next = ListNode(mid.val)
  56.             mid = mid.next
  57.             cur = cur.next
  58.        
  59.         return root
  60.    
  61.     def mergesort(self, head):
  62.        
  63.         if not head.next:  # If only one node, return the node
  64.             return head
  65.        
  66.         temp = self.find_mid(head)  # temp is having node just before mid node so that we can break
  67.        
  68.         mid = temp.next  # mid node
  69.         temp.next = None  # breaking the linked list into two halves
  70.        
  71.         head = self.mergesort(head)
  72.         mid = self.mergesort(mid)
  73.        
  74.         ans = self.merge(head, mid)
  75.         return ans
  76.    
  77.     def sortList(self, head):
  78.         if not head:
  79.             return head
  80.         return self.mergesort(head)
Advertisement
Add Comment
Please, Sign In to add comment