題目描述
對鏈表進行插入排序。
插入排序的動畫演示如上。從第一個元素開始,該鏈表可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入數據中移除一個元素(用紅色表示),並原地將其插入到已排好序的鏈表中。
插入排序算法:
- 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
- 每次迭代中,插入排序只從輸入數據中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
- 重復直到所有輸入數據插入完為止。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
解題思路
從鏈表頭部開始遍歷,記錄當前要插入排序的節點和其上一個節點,對每個節點執行如下操作:
- 從頭部開始找到當前節點之前第一個不大於它的節點,記錄找到的節點以及它前一個節點
- 如果它前一個節點為空,說明要插入到頭節點之前,若不為空,則插入到該節點之后
- 繼續進行下一次插入排序,直到遍歷到鏈表尾部
代碼
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* insertionSortList(ListNode* head) { 12 if(head == NULL) return NULL; 13 ListNode *now = head->next, *pre = head; 14 while(now){ 15 ListNode *loc = head, *insert = NULL; 16 while(loc != now && loc->val <= now->val){ 17 insert = loc; 18 loc = loc->next; 19 } 20 if(loc != now){ 21 pre->next = now->next; 22 if(insert == NULL){ 23 now->next = head; 24 head = now; 25 } 26 else{ 27 now->next = insert->next; 28 insert->next = now; 29 } 30 } 31 else pre = pre->next; 32 now = pre->next; 33 } 34 return head; 35 } 36 };