**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:** []
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
// corner cases
if (head == null || head.next == null) return head;
// O(nlogn) merge sort, quick sort, heap sort. because of the nature of Linked List, quick sort and heap sort are not applicable because they require calling index.
// use merge sort
// find mid node, 2 pointers
ListNode mid = findMid(head);
//divide 2 parts, head and second
ListNode first = head;
ListNode second = mid.next;
mid.next = null;
//recursive
first = sortList(first);
second = sortList(second);
//conquer: merge 2 sorted parts, dummy node
ListNode dummy = new ListNode(0);
ListNode ranger = dummy;
while (first != null && second != null) {
if (first.val < second.val) {
ranger.next = first;
first = first.next;
} else {
ranger.next = second;
second = second.next;
}
ranger = ranger.next;
}
if (first == null) ranger.next = second;
else ranger.next = first;
return dummy.next;
}
private ListNode findMid(ListNode head) {
ListNode fast = head, slow = head;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}