力扣 147. 對連結串列進行插入排序

雲軒x發表於2020-11-30

對連結串列進行插入排序。

在這裡插入圖片描述

插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。

插入排序演算法:

插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
重複直到所有輸入資料插入完為止。

示例 1:

輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:

輸入: -1->5->3->4->0
輸出: -1->0->3->4->5

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
            if(head==nullptr)
            return head;
            ListNode* dummyhead=new ListNode(0); 
            dummyhead->next=head;
            ListNode* last=head;
            ListNode* curr=head->next;
           while(curr!=nullptr){
               if(last->val<=curr->val){
                   last=last->next;
               }
               else{
                     ListNode* pre=dummyhead;
                     while(pre->next->val<=curr->val){
                         pre=pre->next;
                     }
                     last->next=curr->next;
                     curr->next=pre->next;
                     pre->next=curr;
               }
               curr=last->next;
           }
           return dummyhead->next;
    }
};

相關文章