Advertisement
yarin0600

MergeSort zehu ze acol

Oct 24th, 2023
574
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1.     ListNode *merge(ListNode *leftHead, ListNode *rightHead)
  2.     {
  3.         ListNode dummy_head(INT_MAX);
  4.         ListNode *tailOfSortedList = &dummy_head;
  5.         while (leftHead && rightHead)
  6.         {
  7.             if (leftHead->val < rightHead->val)
  8.             {
  9.                 tailOfSortedList->next = leftHead;
  10.                 leftHead = leftHead->next;
  11.             }
  12.             else
  13.             {
  14.                 tailOfSortedList->next = rightHead;
  15.                 rightHead = rightHead->next;
  16.             }
  17.             tailOfSortedList = tailOfSortedList->next;
  18.         }
  19.  
  20.         while (leftHead)
  21.         {
  22.             tailOfSortedList->next = leftHead;
  23.             leftHead = leftHead->next;
  24.             tailOfSortedList = tailOfSortedList->next;
  25.         }
  26.  
  27.         while (rightHead)
  28.         {
  29.             tailOfSortedList->next = rightHead;
  30.             rightHead = rightHead->next;
  31.             tailOfSortedList = tailOfSortedList->next;
  32.         }
  33.  
  34.         tailOfSortedList = dummy_head.next;
  35.         return tailOfSortedList;
  36.     }
  37.  
  38.     ListNode *sortList(ListNode *head)
  39.     {
  40.         if (!head || !(head->next))
  41.             return head;
  42.         ListNode *slow, *fast, *prevMiddle;
  43.         ListNode dummy_head(INT_MAX);
  44.         dummy_head.next = head;
  45.  
  46.         prevMiddle = &dummy_head;
  47.  
  48.         slow = fast = head;
  49.         while (fast && fast->next)
  50.         {
  51.             prevMiddle = prevMiddle->next;
  52.             slow = slow->next;
  53.             fast = fast->next->next;
  54.         }
  55.         // slow = mid node of current list
  56.         prevMiddle->next = nullptr;
  57.         // now we reduced the list to two sublists: head until prevMiddle and slow until the tail of the current list.
  58.         ListNode *left = sortList(head);
  59.         ListNode *right = sortList(slow);
  60.  
  61.         ListNode *sortedList = merge(left, right);
  62.  
  63.         return sortedList;
  64.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement