1. 程式人生 > 其它 >【LeetCode】C++ :中等題 - 連結串列 147. 對連結串列進行插入排序

【LeetCode】C++ :中等題 - 連結串列 147. 對連結串列進行插入排序

技術標籤:LeetCode# 連結串列連結串列插入排序演算法leetcode

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

難度中等344

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


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

插入排序演算法:

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

示例 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() : 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 == nullptr){
            return head;
        }
        ListNode* dummyHead = new ListNode();
        dummyHead->next = head;
        ListNode* lastSorted = head;
        ListNode* curr = head->next;
        while(curr != nullptr){
            if(lastSorted->val <= curr->val){
                lastSorted = lastSorted->next;
            }else{
                ListNode* prev = dummyHead;
                while(prev->next->val <= curr->val){
                    prev = prev->next;
                }
                lastSorted->next = curr->next;
                curr->next = prev->next;
                prev->next = curr;
            }
            curr = lastSorted->next;
        }
        return dummyHead->next;
    }
};