题目描述:
Sort a linked list in O(n log n) time using constant space complexity
题目分析:
看其时间复杂度,想到与数组排序相关的一些排序算法,满足这个复杂度的基本算法就只有快速排序和归并排序了,而快速排序不适合链表,所以想到用归并排序。
public class SortList {
/*采用与数组排列相同的方法——归并排序。
* 1:把链表分成两个基本等长的两个链表
* 2:对这两个链表分别递归归并排序
* 3:合并这两个链表
*/
public ListNode sortList(ListNode head) {
if(head==null||head.next==null)
return head;
ListNode mid=findMid(head);
ListNode midNext=mid.next;
mid.next=null;
ListNode head1=sortList(head);
ListNode head2=sortList(midNext);
return mergeList(head1,head2);
}
//按顺序合并两个List
public ListNode mergeList(ListNode head1,ListNode head2){
if(head1==null)
return head2;
if(head2==null)
return head1;
ListNode h1=head1;
if(head1.val>head2.val)
h1=head2;
ListNode h2=h1;
if(h1==head1)
head1=head1.next;
else
head2=head2.next;
while(head1!=null&&head2!=null){
if(head1.val<head2.val){
h2.next=head1;
h2=h2.next;
head1=head1.next;
}
else{
h2.next=head2;
h2=h2.next;
head2=head2.next;
}
}
if(head1!=null)
h2.next=head1;
if(head2!=null){
h2.next=head2;
}
return h1;
}
}