插入排序。空间O1,时间ON^2
注意指针使用,RE了几次
/**
* 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) {
if(head==NULL||head->next==NULL) return head;
ListNode* p=head->next;
head->next=NULL;<span style="white-space:pre"> </span>//这句很重要,是RE的关键,要把已经排好的部分和后面原始的部分分隔开!!!
ListNode* prere=head; //后面注释掉的这些prere就是没有上面一句想动态分割两部分,结果不管放在哪都有问题,其实只要上面一句就行
int len=0;
while(p){
len++;
ListNode* tmp=p->next;
ListNode* q=head;
ListNode* pre=NULL;
while((p!=q)&&q){
if(p->val >= q->val){
pre=q;
q=q->next;
continue;
}
break;
}
if(p==q){
//prere=p;
p=p->next;
continue;
}
// prere->next=NULL;
// prere=p;
if(pre==NULL){
pre=head;
head=p;
head->next=pre;
//prere->next=NULL;
//prere=p;
//prere=p;
p=tmp;
}
else{
pre->next=p;
//prere=p;
//prere->next=NULL;
//prere=p;
p->next=q;
p=tmp;
}
}
//prere->next=NULL;
p=head;
while(len--){
p=p->next;
}
p->next=NULL;
return head;
}
};