思路如下:
对于链表O(nlogn)的排序,考虑采用快慢指针找到中点,再使用归并排序进行排序。
其中要注意递归使用方法。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
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之后的先截断,对每个子块进行排序
slow.next=null;
//递归
ListNode left=sortList(head);
ListNode right=sortList(tmp);
//建立辅助ListNode h 作为头部
ListNode h=new ListNode(0);
//记录起始位置,避免因为h在排序时发生变化而找不到起始位置
ListNode res=h;
while(left!=null&&right!=null){
if(left.val<right.val){
h.next=left;
left=left.next;
}
else{
h.next=right;
right=right.next;
}
h=h.next;
}
//接上剩余未排序的结点
h.next=left!=null?left:right;
//返回初始位置下一个结点即为结果
return res.next;
}
}