1. 程式人生 > 其它 >10.對連結串列進行插入排序

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

演算法描述

對連結串列進行插入排序。

原題連結

https://leetcode-cn.com/problems/insertion-sort-list/

說明
  1. 將原來的連結串列進行排序後存放到一個新的連結串列上。
  2. 將新連結串列設定兩個結點指向頭部,一個移動,一個不動。
  3. 將要排序的連結串列設定兩個結點,一個用來移動,一個用來進行操作。防止覆蓋。
  4. 一共有3種情況:
  • 比 比較的數大
  • 比 比較的數小
  • 比尾部的數大
時間複雜度

n表示連結串列長度
O(n*n)

程式碼
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        if (!head) {
            return nullptr;
        }

        ListNode* dummy = new ListNode(0);
        dummy->next = head;
        ListNode* p = dummy;
        
        ListNode* cur = head->next;
        ListNode* move = cur;
        ListNode* last = head;
        last->next = nullptr;

        while (cur) {
            p = dummy;
            
            while (cur->val >= p->next->val) {
                p = p->next;
                if (!p->next) {break;}
            } 

            if (!p->next && cur->val >= p->val) {
                p->next = cur;
                move = cur->next;
                cur->next = nullptr;
                cur = move;
                continue;
            }

            if (cur->val < p->next->val) {
                move = cur;
                cur = cur->next;
                move->next = p->next;
                p->next = move;
            }
        }

        return dummy->next;
    }
};

本文來自部落格園,作者:jsqup,轉載請註明原文連結:https://www.cnblogs.com/jsqup/p/15712275.html