难点在于时空复杂度的要求 转化成:归并排序 + 合并两个有序链表 即可 利用快慢指针来拆分成两条链表 注意:链表的拆分 & 连接 时间复杂度O(n * logn),空间复杂度 O(1) 
class  Solution  { public  ListNode  sortList ( ListNode  head)  { if ( head ==  null  ||  head. next ==  null ) { return  head; } ListNode  fast =  head; ListNode  slow =  head; while ( fast !=  null  &&  fast. next !=  null ) { slow =  slow. next; fast =  fast. next. next; } if ( slow. next ==  null ) { slow =  head; } fast =  sortList ( slow. next) ; slow. next =  null ; slow =  sortList ( head) ; return  mergeSortedList ( slow,  fast) ; } ListNode  mergeSortedList ( ListNode  head1,  ListNode  head2) { if ( head1 ==  null ) { return  head2; } if ( head2 ==  null ) { return  head1; } if ( head1. val <  head2. val) { head1. next =  mergeSortedList ( head1. next,  head2) ; return  head1; } else { head2. next =  mergeSortedList ( head1,  head2. next) ; return  head2; } } 
} 
好吧…记得思路是快慢指针 + 合并有序链表,但是具体咋写确实回想不起来= = 其实就是两个函数:快慢指针二分链表  + 合并两个有序链表 ,双重递归! class  Solution  { public  ListNode  sortList ( ListNode  head)  { if ( head ==  null  ||  head. next ==  null )  { return  head; } ListNode  slow =  head,  fast =  head; while ( fast !=  null  &&  fast. next !=  null )  { slow =  slow. next; fast =  fast. next. next; } if ( slow. next ==  null )  { slow =  head; } fast =  sortList ( slow. next) ; slow. next =  null ; slow =  sortList ( head) ; return  mergeSort ( slow,  fast) ; } public  ListNode  mergeSort ( ListNode  headA,  ListNode  headB)  { if ( headB ==  null )  { return  headA; } if ( headA ==  null )  { return  headB; } if ( headA. val <  headB. val)  { headA. next =  mergeSort ( headA. next,  headB) ; return  headA; } else  { headB. next =  mergeSort ( headA,  headB. next) ; return  headB; } } 
}