LeetCode 147. 對鏈表進行插入排序(Insertion Sort List)


題目描述

 

對鏈表進行插入排序。


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

 

插入排序算法:

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

 

示例 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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM