LeetCode题解--147. 对链表进行插入排序

1. 题目

对链表进行插入排序。
这里写图片描述
    插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
    每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
插入排序算法:
    插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
    每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
    重复直到所有输入数据插入完为止。

2. 分析

我的方法比较原始,就是按照题目要求进行迭代,时间复杂度是O(n^2)。
逐个获取链表中的节点进行插入,插入的时候,在已经排序的前半部分链表当中确定位置,最终完成整个链表的排序过程。
1. 特殊情况:空链表和单个节点的直接返回head;
2. 为了方便在头节点之前进行插入,我们在头节点之前插入一个无效的节点,并将这个节点的值赋值为INT_MIN;
3. 定义指针p指向当前准备插入的节点,当p不等于NULL的时候,执行循环,否则插入完毕,跳出程序。同时定义一个rear指针,指向已经排序部分的最后。每次循环,将p赋值为rear的next。
4. 内层循环利用temp指针确定应该插入的位置,当temp的值比P的值大的时候退出内层循环,那么退出后会出现3种情况:
5. 待插入的节点不在rear前,那么P插入到temp之前,rear指针不移动;
这里写图片描述
6. 待插入的节点在rear前,因比rear的值小,那么P插入到temp之前,rear指针不移动;
这里写图片描述
7. 待插入的节点在rear后,因比rear的值大,那么P插入到temp之后,P的next赋值为rear的next,rear指针移动到P;
这里写图片描述
8. 最后返回head的next为排序后的链表。

3. C++程序

ListNode* insertionSortList(ListNode* head) {
        if(head==NULL||head->next==NULL) return head;
        ListNode* newhead = new ListNode(INT_MIN);
        newhead->next = head;
        head = newhead;
        ListNode *rear = head->next;
        ListNode *p = rear->next;
        while(p!=NULL){            
            //将p节点移除
            cout<<"rear:"<<rear->val;            
            rear->next = p->next;            

            p->next = NULL;
            //确定位置
            ListNode *pre = head;
            ListNode *temp = head->next;
            while(temp->val<=p->val&&temp!=rear){
                pre = temp;
                temp = temp->next;                
            }
            if(temp->val>p->val&&temp!=rear){
                p->next = temp;
                pre->next = p;
            }
            else if(temp->val>p->val&&temp==rear){
                p->next = temp;
                pre->next = p;                
            }
            else{
                p->next = temp->next;
                temp->next = p;
                rear = p;
            }       
            p = rear->next;
        }
        return head->next;
    }

4. 提交结果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_33297776/article/details/81036376