Sort a linked list in O(n log n) time using constant space complexity.
/**
* 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) {
//统计元素数
ListNode tmp = head;
int len = 0;
while(tmp != null){
len++;
tmp = tmp.next;
}
return mergeSort(head,len);
}
public ListNode mergeSort(ListNode s,int len){//待排序链表的首尾元,返回子链的首元
if(len <= 1){
return s;
}else{
int mid = len / 2;
ListNode left = s;//左半链
for(int i = 1 ; i < mid ; i ++){
s = s.next;
}
ListNode right = s.next;//右半链
s.next = null;
//左半链排序
ListNode l1 = mergeSort(left,mid);
//右半链排序
ListNode l2 = mergeSort(right,len - mid);
//左右半链排序
ListNode t = null;
if(l1.val <= l2.val){
t = l1;
l1 = l1.next;
}else{
t = l2;
l2 = l2.next;
}
ListNode head = t;
while(l1 != null && l2 != null){
if(l1.val <= l2.val ){
t.next = l1;
l1 = l1.next;
t = t.next;
}else{
t.next = l2;
t = t.next;
l2 = l2.next;
}
}
if(l1 != null){
t.next = l1;
}
if(l2 != null){
t.next = l2;
}
return head;
}
}
}
Runtime:
476 ms
使用归并排序的思想,时间复杂度为O(nlogn)