Leetcode : 147. 对链表进行插入排序

小明 2025-05-06 19:29:43 4

���定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。

插入排序 算法的步骤:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。

每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。

重复直到所有输入数据插入完为止。

下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。

对链表进行插入排序。

思路:设置左右两对指针,分别负责比较和更改;相比于数组多了pre前置指针,用于修改链表的顺序。
#include 
using namespace std;
 //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) {
//         ListNode* slow = head;
//         ListNode* fast = head;
//         bool flag = false;
//         while (slow->next != NULL){
//             while (fast->next != NULL){
//                 if (fast->val > fast->next->val){
//                     ListnodeSwap(fast, fast->next);
//                     flag = true;
//                 }
//                 fast = fast->next;
//             }
//             if (flag == false) break;
//             fast = slow;
//             flag = false;
//         }
//         return head;
//     }
//     void ListnodeSwap(ListNode* a, ListNode* b){
//         int temp = a->val;
//         a->val = b->val;
//         b->val = temp;
//     }
// };
class Solution {
    public:
        ListNode* insertionSortList(ListNode* head) {
            ListNode* root = new ListNode(0);
            ListNode* left_pre = root;
            left_pre->next = head;
            ListNode* left = head;
            ListNode* right = head->next;
            ListNode* right_pre = head;
            while (right != NULL){
                while (left->val val && left != right){
                    left_pre = left;
                    left = left->next;
                }
                if (left == right){
                    right_pre = right;
                    right = right->next;
                }else{
                    right_pre->next = right->next;
                    right->next = left;
                    left_pre->next = right;
                    if (left == head) 
                        head = right;
                    right = right_pre->next;
                }
                left = head;
                left_pre = root;
                }
                return head;
            }
};
int main(){
    Solution s;
    // ListNode* head = new ListNode(4, new ListNode(2, new ListNode(1, new ListNode(3))));
    ListNode* head = new ListNode(-1, new ListNode(5, new ListNode(3, new ListNode(4, new ListNode(0)))));
    ListNode* res = s.insertionSortList(head);
    for (ListNode* i = res; i != NULL; i = i->next){
        cout val 
The End
微信