147. Insertion Sort List

思路:

我们需要一个指向已排序链表的最后一个元素的指针lastsort,一个cur指针指向当前用来排序的元素。为了避免head被改变导致错误,还需要一个dummy指针指向head。
首先lastsort指向head,cur指向head->next。然后遍历链表,判断lastsort是否小于cur,如果小于,说明dummy->next到cur就是有序的,就不用对cur进行排序处理,并且将lastsort=lastsort->next。如果lastsort大于cur,说明cur应该被排序。因为dummy到lastsort是已经排好序的,所以我们在声明一个pre指针用来找到排序好的链表中最后一个小于cur的元素,当找到这个元素后,移动cur将会丢失下一个没排序的元素,所以将lastsort->next=cur->next,用来记录下一个未排序的元素,最后就把cur插入进去即可。
当cur排好序后,cur指的位置小于等于lastsort指的位置,而lastsort->next就为cur改变之前的cur->next元素,我们就将cur指向lastsort->next再重复上述步骤即可。
代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        if(head==NULL) return head;
        ListNode* dummy=new ListNode(0,head);
        ListNode* cur=head->next;
        ListNode* lastsorted=head;
        while(cur!=NULL){
           if(lastsorted->val<=cur->val){
               lastsorted=lastsorted->next;
           }
           else{
               ListNode* pre=dummy;
               while(pre->next->val<=cur->val){
                   pre=pre->next;
               }
                lastsorted->next=cur->next;
                cur->next=pre->next;
                pre->next=cur;
           }
           cur=lastsorted->next;
        }
        return dummy->next;
    }
};
posted @ 2021-04-12 16:24  Mrsdwang  阅读(33)  评论(0编辑  收藏  举报