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

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

題目描述

插入排序演算法:
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

思路解析

  1. 新建一個節點 dhead,令dhead->next = head,方便後續插入;
  2. 記錄節點 lastSorted,指向已經排序好的最後一個節點,初始化時 lastSorted = head
  3. 開始遍歷連結串列,記錄當前節點為 p
  4. 比較 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;
    }
};