列表

详情


NC244. 对链表进行插入排序

描述

对链表进行插入排序,
从链表第一个元素开始可以视为部分已排序,每次操作从链表中移除一个元素,然后原地将移除的元素插入到已排好序的部分。

数据范围:链表长度满足 ,链表中每个元素满足

例如输入{2,4,1}时,对应的返回值为{1,2,4},转换过程如下图所示:

示例1

输入:

{1,2,3}

输出:

{1,2,3}

示例2

输入:

{2,4,1}

输出:

{1,2,4}

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 392KB, 提交时间: 2022-01-14

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* insertionSortList(ListNode* head) {
        // write code here
        if(!head || !head->next)
            return head;
        ListNode* cur = head;
        vector<int> res;
        while(cur)
        {
            res.push_back(cur->val);
            cur = cur->next;
        }
        sort(res.begin(),res.end());
        cur = head;
        int index = 0;
        while(cur)
        {
            cur->val = res[index++];
            cur = cur->next;
        }

        return head;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-05-08

class Solution {
  public:
    ListNode* insertionSortList(ListNode* head) {
        if (!head || !head->next)
            return head;
        ListNode* c = head;
        vector<int> res;
        while (c) {
            res.push_back(c->val);
            c = c->next;
        }
        sort(res.begin(), res.end());
        c = head;
        int index = 0;
        while (c) {
            c->val = res[index++];
            c = c->next;
        }
        return head;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-01-22

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* insertionSortList(ListNode* head) {
        // write code here
        if(head==NULL){
            return NULL;
        }else if(head->next == NULL){
            return head;
        }
        
        ListNode* cur = head->next;
        ListNode* pre = head;
        
        ListNode *aux = new ListNode(-1);
        aux->next = head;
        
        while(cur != NULL){
            if(cur->val<pre->val){
                pre->next = cur->next;
                ListNode* l1 = aux;
                ListNode* l2 = aux->next;
                while(cur->val>l2->val){
                    l1=l2;
                    l2=l2->next;
                }
                l1->next = cur;
                cur->next = l2;
                cur = pre->next;
            }else{
                pre = cur;
                cur = cur->next;
              }
        }
        return aux->next;  //返回原单链表的首节点。
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 404KB, 提交时间: 2022-06-05

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* insertionSortList(ListNode* head) {
        // write code here
        if (!head || head->next == nullptr)
            return head;

        ListNode* pre_head = new ListNode(-1);
        pre_head->next = head;
        ListNode* search = pre_head;
        ListNode* cur = head->next;
        ListNode* pre = head;

        while (cur)
        {
            if (cur->val < pre->val)
            {
                while (search->next != nullptr && search->next->val < cur->val)
                    search = search->next;

                pre->next = cur->next;
                cur->next = search->next;
                search->next = cur;

                cur = pre->next;
                search = pre_head;
            }
            else
            {
                pre = cur;
                cur = cur->next;
            }
        }
        return pre_head->next;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 404KB, 提交时间: 2022-02-20

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* insertionSortList(ListNode* head) {
        // write code here
//         vector<int> temp;
//         ListNode* p=head;
//         while(p){
//             temp.push_back(p->val);
//             p=p->next;
//         }
//         sort(temp.begin(),temp.end());
//         p=head;
//         for(int i=0;i<temp.size();i++){
//             p->val=temp[i];
//             p=p->next;
//         }
//         return head;
        if(!head||!head->next)return head;
        ListNode* pre=head;
        ListNode* cur=head->next;
        ListNode* dummyhead=new ListNode(-1);
        dummyhead->next=head;
        while(cur){
            if(cur->val<pre->val){
                ListNode* temp=dummyhead;
                while(temp->next->val<cur->val)temp=temp->next;
                pre->next=cur->next;
                cur->next=temp->next;
                temp->next=cur;
                cur=pre->next;
            }
            else{
                cur=cur->next;
                pre=pre->next;
            }
        }
        return dummyhead->next;
    }
};

上一题