链接:
这道题是一个很常规的题,插入排序我也已经很熟悉了。
对链表进行插入排序,其实就是分俩种情况,第一个是在头部插入,需要更改头节点的指向,第二个就是在中间插入,我们遍历的时候只需要记得 当前位置的前一个 指针,然后给插入就好了,要记得的是,第一次插入要置空处理。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* insertionSortList(struct ListNode* head) {
if(head==NULL||head->next==NULL) return head;
struct ListNode *newHead=NULL,*p=head,*q=NULL;
while(p)
{
q=p;
if(p->next) p=p->next;
else p=NULL;
if(newHead==NULL)
{
newHead=q;
newHead->next=NULL;
}
else{
struct ListNode *r=newHead;
if(q->val<=newHead->val)
{
q->next=newHead;
newHead=q;
}
else {
struct ListNode *pre=r;
for(r;r&&r->val<=q->val;r=r->next){
pre=r;
}
pre->next=q;
q->next=r;
}
}
}
return newHead;
}