对于数组的各种排序算法如,插入排序,冒泡排序,快速排序都可以在不改变算法复杂度的情况下移植到单链表上面,但是有一些细节需要注意,
1.单链表快速排序的实现(O(nlgn)):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
void qksort(ListNode *start,ListNode *end){
if(start == end) return;
ListNode *p=start,*q=p->next;
while(q!=end){
if(q->val < start->val){
p = p->next;
swap(p->val,q->val);
}
q = q->next;
}
swap(start->val,p->val);
qksort(start,p);
qksort(p->next,end);
}
ListNode *sortList(ListNode *head) {
if(head == NULL||head->next==NULL) return head;
ListNode *start = head;
qksort(start,NULL);
return head;
}
1.单链表插入排序的实现(O(n2)):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
ListNode *insertionSortList(ListNode *head) {
if(head == NULL||head->next == NULL) return head;
for(ListNode *p = head;p!=NULL;p = p->next){
for(ListNode *q = p->next;q!=NULL;q = q->next){
if(p->val>q->val) swap(p->val,q->val);
}
}
return head;
}