148. 排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 ,要求时间复杂度为nlogn

    思路,归并排序,先二分差分链表,然后归并

      拆分成子链表为有序,那么就要差分到长度为1,然后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) {
        return listSort(head, nullptr);
    }
    ListNode* listSort(ListNode* head, ListNode* tail) {
        if (head == nullptr) return nullptr;
        if (head->next == tail) {
            head->next = nullptr;
            return head;
        }
        auto slow = head;
        auto fast = head;
        while (fast != tail) {
            slow = slow->next;
            fast = fast->next;
            if (fast != tail)
                fast = fast->next;
        }
        auto mid = slow;
        return merge(listSort(head, mid), listSort(mid, tail));
    }
    ListNode* merge(ListNode* head1, ListNode* head2) {
        ListNode* header = new ListNode(0);
        ListNode *tmp = header, *tmp1 = head1, *tmp2 = head2;
        while (tmp1 && tmp2) {
            if (tmp1->val <= tmp2->val) {
                tmp->next = tmp1;
                tmp1 = tmp1->next;
            } else {
                tmp->next = tmp2;
                tmp2 = tmp2->next;
            }
            tmp = tmp->next;
        }
        if (tmp1) {
            tmp->next = tmp1;
        }
        if (tmp2) {
            tmp->next = tmp2;
        }
        return header->next;
    }
};
复制代码

 

posted @   tuffy_tc  阅读(12)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示