Leetcode典型題解答和分析、歸納和彙總——T147(對鏈表進行插入排序)

問題描述:

對鏈表進行插入排序:

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

問題分析:

本題考察的是插入排序,只是其基本的數據結構爲:鏈表!!我們非常熟悉數組類型的數據,但是這種帶指針類型的數據存在一些理解上的誤區!其實這種鏈表結構類型的數據可以大大節省空間,而且可以保證數據的順序存儲。

下面給出插入排序的一般解題思路:

【1】將數據分爲兩部分,一是已經排序的數組,二是未排序的數組。

【2】每次從未排序的數組中選取一個元素,然後進行刪除處理;

【3】在已排序的數組中進行插入;

【4】重複【2、3】步驟,直到未排序的數組清空爲止。

/**
 * 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==nullptr||head->next==nullptr) return head;

       ListNode* dummy = new ListNode(-1); //創建啞節點

       dummy ->next = head;
       ListNode* prev = head;
       ListNode* node = head->next;
       while(node)
       {
           if((node->val)<(prev->val) ) //如果後一個節點比前一個節點值小,要交換
           {
            ListNode *tmp = dummy;
            while(tmp->next->val < node->val)
            {
                tmp =tmp->next;
            }
            prev->next = node->next;
            node->next = tmp->next;
            tmp->next = node;
            node = prev->next;
           }

           else {
               prev = prev->next;
               node = node->next;
           }
       }
       return dummy->next;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章