Insertion Sort List

Sort a linked list using insertion sort.

注意:

1.当新链表要插入最小值时,即插入一个新的头结点,那么原来的指向头结点的指针要更换。sortedList=s;使得sortedList指针也指向s所指的节点。(s为新头结点)

2.注意q和preq的关系,插入最大结点时,preq为最后一个结点,而q为NULL,所以循环条件是q!=NULL

代码更新,其实只需新建一个虚拟的头结点sortedHead,那么可以使得我们的插入操作变得更加简单,不再需要区分插入头部,还是插入中间或者尾部。

0x80 00 00 00是32位机中int的最小值

class Solution {
public:
    ListNode *insertionSortList(ListNode *head) {
        if(head==NULL) return NULL;
        ListNode* p=head;
        
        ListNode* sortedHead=(ListNode*)malloc(sizeof(ListNode));
        sortedHead->val=0x80000000;
        sortedHead->next=NULL;
        ListNode* s=(ListNode*)malloc(sizeof(ListNode));
        s->val=p->val;
        sortedHead->next=s;
        s->next=NULL;

        ListNode* preq=sortedHead;
        ListNode* q=sortedHead->next;

        while(p->next!=NULL){
            p=p->next;
            while(q!=NULL&&p->val>q->val){
                preq=q;
                q=q->next;
            }
            
            //插入操作
            ListNode* s=(ListNode*)malloc(sizeof(ListNode));
            s->val=p->val;
            s->next=preq->next;
            preq->next=s;
 
            preq=sortedHead;
            q=preq->next;
        }
        return sortedHead->next;
    }
};

第一次AC代码:

class Solution {
public:
    ListNode *insertionSortList(ListNode *head) {
        if(head==NULL) return NULL;
        ListNode* p=head;
        ListNode* sortedList=(ListNode*)malloc(sizeof(ListNode));
        sortedList->val=p->val;
        sortedList->next=NULL;
        ListNode* q=sortedList;
        ListNode* preq=NULL;
        bool notmove=true;
        while(p->next!=NULL){
            p=p->next;
            while(q!=NULL&&p->val>q->val){
                preq=q;
                q=q->next;
                notmove=false;
            }
            
            ListNode* s=(ListNode*)malloc(sizeof(ListNode));
            if(notmove){
                if(p->val>q->val)
                    {s->val=p->val;q->next=s;s->next=NULL;}//插入尾部
                else 
                    {s->val=p->val;s->next=q;sortedList=s;}//插入头部
            }else{
                if(q==NULL)
                {
                    if(p->val>preq->val)
                       {s->val=p->val;preq->next=s;s->next=NULL;}//插入尾部
                }
                else{s->val=p->val;s->next=preq->next;preq->next=s;}//插入中间
            }
            q=sortedList;
            preq=NULL;
            notmove=true;
        }
        return sortedList;
    }
};
原文地址:https://www.cnblogs.com/fightformylife/p/4194512.html