1. 程式人生 > 實用技巧 >147. 對連結串列進行插入排序 連結串列

147. 對連結串列進行插入排序 連結串列

插入排序演算法:

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

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


著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

一個指標指向當前已排序的最後一個位置,這裡用的是head指標
另外一個指標pre,每次從表頭迴圈,這裡用的是表頭指標
每次拿出未排序的節點,先和前驅比較,如果大於或者等於前驅,就不用排序了,直接進入下一次迴圈。
如果前驅小,則進入內層迴圈,依次和pre指標比較,插入對應位置即可。

/**
 * 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) {
        ListNode* ret = new ListNode;
        ret->next = head;

        while (head && head->next) {
            if (head->val <= head->next->val) {
                head = head->next;
                continue;
            }

            ListNode* pre = ret;
            while (pre->next) {
                if (pre->next->val > head->next->val) {
                    break;
                }
                pre = pre->next;
            }

            ListNode* cur = head->next;
            head->next = cur->next;
            cur->next = pre->next;
            pre->next = cur;
        }
        return ret->next;
    }
    
    
};