1.题目
2.解法一
代码:
truct ListNode* insertionSortList(struct ListNode* head){
if(head==NULL)
return head;
//哨兵位
struct ListNode* newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
newhead->next=head;
struct ListNode* cur=head->next;
newhead->next->next=NULL;
while(cur)
{
struct ListNode* qsort=newhead->next;//取得头指针
struct ListNode* qsort_prev=newhead;
while(qsort)
{
if(cur->val<=qsort->val)//插在前面
{
//进行链接
struct ListNode* next=cur->next;//保存后面的节点
cur->next=qsort;
qsort_prev->next=cur;
cur=next;//更新
break;
}
//排好序的链表进行后移
qsort_prev=qsort;
qsort=qsort->next;
}
if(qsort==NULL)//要插入的节点比所有节点都大
{
qsort_prev->next=cur;
struct ListNode* next=cur->next;//保存后面的节点
cur->next=NULL;//将节点中的指针置空
cur=next;
}
}
struct ListNode* ret_head=newhead->next;
free(newhead);
return ret_head;
};
3.解法二
代码
struct ListNode* insertionSortList(struct ListNode* head){
if(head==NULL)
return head;
struct ListNode *newhead=(struct ListNode*)malloc(sizeof(struct ListNode));//哨兵位
newhead->next=head;
struct ListNode *cur=newhead->next;
struct ListNode *prev=newhead;
while(cur->next)
{
struct ListNode *next_prev=cur;
struct ListNode *next=cur->next;
while(next)
{
if((next->val)<=(cur->val))
{
next_prev->next=next->next;//保存后面的节点
prev->next=next;//插到前面
next->next=cur;
cur=prev->next;//cur回到起点位置
next=next_prev->next;//next指针位置更新
}
else//往后挪
{
next_prev=next;
next=next->next;
}
}
//完成一个点的比较,cur此时已经是最小的,往后挪进行下一个点的比较
prev=cur;
cur=cur->next;
}
struct ListNode *ret_head=newhead->next;
free(newhead);
return ret_head;
}