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;
    }
};
posted @ 2021-12-20 18:09  jsqup  阅读(116)  评论(0编辑  收藏  举报