Basic idea is from divide and conquer, utilizing the function MergeTwoLists() from Question 23.

```
public class Solution {
private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1==null) return l2;
else if(l2==null) return l1;
ListNode dummy = new ListNode(0);
ListNode head=dummy;
while(l1!=null||l2!=null){
if((l1==null?Integer.MAX_VALUE:l1.val)<=(l2==null?Integer.MAX_VALUE:l2.val)){
dummy.next=l1;
l1 = l1==null? l1:l1.next;
}else{
dummy.next=l2;
l2 = l2==null? l2:l2.next;
}
dummy=dummy.next;
}
return head.next;
}
private ListNode findMiddle(ListNode head){
ListNode slow = head, fast = head.next;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
public ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode mid = findMiddle(head);
ListNode right = sortList(mid.next);
mid.next = null;
ListNode left = sortList(head);
return mergeTwoLists(left, right);
}
}
```