privateListNodegetMid(ListNode head){// Slow fast pointer to determine the middle nodeListNode slow = head, fast = head.next;// When the fast pointer is still validwhile(fast !=null&& fast.next !=null){
slow = slow.next;
fast = fast.next.next;// Shift twice}return slow;}
Code
classSolution{publicListNodesortList(ListNode head){// Base caseif(head ==null|| head.next ==null){return head;}// Split the listListNode left = head;ListNode right =getMid(head);// Hold the initial right pointerListNode tmp = right.next;
right.next =null;
right = tmp;// Move pointer
left =sortList(left);
right =sortList(right);returnmerge(left, right);}privateListNodegetMid(ListNode head){// Slow fast pointer to determine the middle nodeListNode slow = head, fast = head.next;// When the fast pointer is still validwhile(fast !=null&& fast.next !=null){
slow = slow.next;
fast = fast.next.next;// Shift twice}return slow;}privateListNodemerge(ListNode left,ListNode right){// Store the beginningListNode dummy =newListNode();ListNode tail = dummy;// traverse the nodeswhile(left !=null&& right !=null){if(left.val < right.val){
tail.next = left;
left = left.next;}else{// left equal or larger than right
tail.next = right;
right = right.next;}
tail = tail.next;}// Merge all the remaining nodesif(left !=null){
tail.next = left;}if(right !=null){
tail.next = right;}return dummy.next;}}