public static void Main()
head.next.next = new Node(3);
head.next.next.next = new Node(8);
Node newHead = mergeSort(head);
private static Node mergeSort(Node h)
if(h == null || h.next == null)
Node rightAfterMid = mid.next;
var leftList = mergeSort(h);
var rightList = mergeSort(rightAfterMid);
return mergeSortedLists(leftList, rightList);
private static void Push(Node head, Node node)
private static Node mergeSortedLists(Node leftList, Node rightList)
Node currLeft = leftList;
Node currRight = rightList;
Node result = new Node(0);
while(currLeft != null && currRight != null)
if(currLeft.val < currRight.val)
Push(result, new Node(currLeft.val));
currLeft = currLeft.next;
Push(result, new Node(currRight.val));
currRight = currRight.next;
Push(result, new Node(currLeft.val));
currLeft = currLeft.next;
Push(result, new Node(currRight.val));
currRight = currRight.next;
private static Node getMiddle(Node head)
if(head == null) return head;
Node fastPtr = head.next;
private static void print(Node node)
Console.Write($"{current.val} ");