本质 : 归并排序 + 打断链表
public ListNode sortList(ListNode head) {
if(head == null || head.next == null){
return head;
}
//快慢指针寻找链表中点
ListNode slow = head;
ListNode fast = head.next;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
ListNode tmp = slow.next;
//打断链表,这一步非常重要
slow.next = null;
//递归
ListNode left = sortList(head); //递归下去得到的链表都是有序的
ListNode right = sortList(tmp);
//开始合并
ListNode help = new ListNode(0);
ListNode save = help;
while(left != null && right != null){
if(left.val <= right.val){
help.next = left;
left = left.next;
}else{
help.next = right;
right= right.next;
}
help = help.next;
}
if(left !=null){
help.next = left;
}
if(right!= null){
help.next = right;
}
return save.next;
}