In O(nlgn) time.
使用merge sort, 由于使用了递归, 复杂度 T(n) 为
T(n) = n + 2T(n/2)
和数列的merge sort相比, merge部分和寻找中点部分同样需要O(n)时间, 所以时间复杂度不变
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
// merge sort style
if(head == null || head.next == null) return head;
ListNode p = head, q = head;
ListNode prev = null;
while(q!= null && q.next != null){
q = q.next.next;
prev = p;
p = p.next;
}
prev.next = null;
q = sortList(head);
p = sortList(p);
//merge
ListNode ans = p;
if(p.val < q.val){
ans = p;
p = p.next;
}else{
ans = q;
q = q.next;
}
prev = ans;
while(p != null && q!= null){
if(p.val < q.val){
prev.next = p;
prev = p;
p = p.next;
}else{
prev.next = q;
prev = q;
q = q.next;
}
}
if(p != null) prev.next = p;
else prev.next = q;
return ans;
}
}