1.Sort a linked list in O(n log n) time using constant space complexity.
使用合并排序对单链表进行排序,时间复杂度为O(nlogn),使用插入排序对单链表进行排序,时间复杂度为O(n2);
public class Sort_list {
public ListNode findMiddle(ListNode head){
ListNode walker=head;
ListNode runner=head.next;
while(runner!=null&&runner.next!=null){
walker=walker.next;
runner=runner.next.next;
}
return walker;
}
//合并两个有序列表
public ListNode merge(ListNode l1,ListNode l2){
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
ListNode helper=new ListNode(0);
ListNode head=helper;
while(l1!=null&&l2!=null){
if(l1.val>l2.val){
head.next=l2;
l2=l2.next;
}
else{
head.next=l1;
l1=l1.next;
}
head=head.next;
}
if(l1==null){
head.next=l2;
}
if(l2==null){
head.next=l1;
}
return helper.next;
}
public ListNode sortList(ListNode head) {
if (head==null||head.next==null) {
return head;
}
ListNode middle=findMiddle(head);
ListNode right=sortList(middle.next);
middle.next=null;
ListNode left=sortList(head);
return merge(left,right);
}
}
/*归并排序的一般步骤为:
1)将待排序数组(链表)取中点并一分为二;
2)递归地对左半部分进行归并排序;
3)递归地对右半部分进行归并排序;
4)将两个半部分进行合并(merge),得到结果。
-
-
- 1.找到链表中点,快慢指针思路,快指针走两步,慢指针走一步,当快指针指向最后一个结点时,慢指针指向链表中点。
- 2.写出merge函数,即如何合并链表;
- 3.mergesort函数,采用归并排序将一个单链表进行排序的时间复杂度为O(n*logn);
- *
插入排序:
public ListNode insertionSortList(ListNode head){
if(head==null||head.next==null){
return head;
}
ListNode helper=new ListNode(0);
ListNode p=helper;
ListNode cur=head;
while(cur!=null){
ListNode next=cur.next; //保存head的位置
while(p.next!=null&&p.next.val<cur.val){
p=p.next;
}
cur.next=p.next;
p.next=cur;
cur=next;
}
return helper.next;
}