LC-148-排序链表

77 篇文章 1 订阅
63 篇文章 0 订阅

原题链接:排序链表

个人解法

思路:

借助数组,讲链表结点存入数组中再进行排序后取出

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn), 空间复杂度: O ( n ) O(n) O(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* sortList(ListNode* head) {
        vector<pair<int, ListNode*>> v;
        ListNode *p = head;
        while(p) {
            v.push_back({p->val, p});
            p = p->next;
        }  
        sort(v.begin(), v.end());
        ListNode *pre_head = new ListNode();
        p = pre_head;
        for(auto &t : v) {
            p->next = t.second;
            p = p->next;
            p->next = nullptr;
        }
        return pre_head->next;
    }
};

更好的解法

思路:

归并排序,因为是链表的形式,故归并的时候只需要按顺序链上即可,此时空间复杂度为常数

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn), 空间复杂度: O ( 1 ) O(1) O(1)

代码:

/**
 * 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 *mergesort(ListNode *start, ListNode *end) {
        if(start->next == end) {
            start->next = nullptr;
            return start;
        }
        ListNode *p = start, *q = start;
        while(q != end && q->next != end) {
            p = p->next;
            q = q->next->next;
        }
        ListNode *left = mergesort(start, p);
        ListNode *right = mergesort(p, end);
        ListNode *pre_head = new ListNode();
        ListNode *t = pre_head;
        while(left && right) {
            if(left->val < right->val) {
                t->next = left;
                left = left->next;
            }else {
                t->next = right;
                right = right->next;
            }
            t = t->next;
            t->next = nullptr;
        }
        while(left) {
            t->next = left;
            left = left->next;
            t = t->next;
            t->next = nullptr;
        }
        while(right) {
            t->next = right;
            right = right->next;
            t = t->next;
            t->next = nullptr;
        }
        ListNode *res = pre_head->next;
        delete(pre_head);
        return res;
    }

    ListNode* sortList(ListNode* head) {
        if(head == nullptr) return nullptr;
        head = mergesort(head, nullptr);
        return head;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值