LeetCode 147. 對連結串列進行插入排序
阿新 • • 發佈:2020-11-20
題目描述
插入排序演算法:
1. 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
2. 每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
3. 重複直到所有輸入資料插入完為止。
示例1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/insertion-sort-list
思路解析
- 新建一個節點
dhead
,令dhead->next = head
,方便後續插入; - 記錄節點
lastSorted
,指向已經排序好的最後一個節點,初始化時lastSorted = head
; - 開始遍歷連結串列,記錄當前節點為
p
; - 比較
lastSorted
與當前節點p
的值,若lastSorted->val < p->val
,則p
在當前位置直接就是有序的,lastSorted
後移一位,否則將p
插入到前面,並更新lastSorted->next = p->next
。
程式碼實現
/** * 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) return head; ListNode* dhead = new ListNode(0); dhead->next = head; ListNode* lastSorted = head; ListNode* p = head->next; while(p != NULL) { if(lastSorted->val < p->val) { lastSorted = p; p = p->next; } else { ListNode* insp = dhead; ListNode* ins = dhead->next; while(ins->val < p->val) { ins = ins->next; insp = insp->next; } ListNode* nxt = p->next; lastSorted->next = nxt; insp->next = p; p->next = ins; p = nxt; } } return dhead->next; } };