【LeetCode】C++ :中等題 - 連結串列 147. 對連結串列進行插入排序
阿新 • • 發佈:2021-02-04
技術標籤:LeetCode# 連結串列連結串列插入排序演算法leetcode
難度中等344
對連結串列進行插入排序。
插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。插入排序演算法:
- 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
- 每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
- 重複直到所有輸入資料插入完為止。
示例 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; } };