链表插入排序,注意点:
一、表头也是有存储数据的;二、最好空间为O(1),即在原链表上排序。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
ListNode *p,*q,*temp,*t1;
if(!head||!head->next ) return head;// 没有元素或者只有一个元素
q=head->next ;
head->next =NULL;
p=head;
while(q!=NULL){
bool x=false;
temp=q->next ;
if(q->val <head->val ){// 插入到头结点之前
q->next =head;
head=q;
x=true;
}
else
{
p=head;
while(p->next !=NULL)
{//插到中间
if(q->val <p->next ->val )
{
t1=p->next ;
p->next =q;
q->next =t1;
x=true;
break;
}
p=p->next ;
}
}
if(!x) {// 插到尾部
p->next =q;
q->next =NULL;
}
q=temp;
}
return head;
}
};