思路:采用归并排序思想,先利用快慢指针把链表分成两半,然后再合并到一起。
可以参考归并排序
public ListNode sortList(ListNode head){
if(head==null||head.next==null) return head;
ListNode midNode=middleList(head);
ListNode rightHead=midNode.next;
midNode.next=null;
ListNode left=sortList(head);
ListNode right=sortList(rightHead);
return mergeTwoLists(left,right);
}
private ListNode middleList(ListNode head){
if(head==null||head.next==null) return head;
ListNode slow=head;
ListNode fast=head.next.next;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
private ListNode mergeTwoLists(ListNode left,ListNode right){
ListNode temp=new ListNode(-1);
ListNode node=temp;
while(left!=null&&right!=null){
if(left.val<right.val){
node.next=left;
left=left.next;
}
else{
node.next=right;
right=right.next;
}
node=node.next;
}
node.next=left==null?right:left;
return temp.next;
}