排序链表(归并排序)

148. 排序链表 - 力扣(LeetCode)

以O(nlogn)时间复杂度, O(1)空间复杂度 排序链表

涉及知识点:

cpp 复制代码
/**
 * 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 {
private:
    // 合并有序链表
    ListNode *mergeList(ListNode *list1, ListNode *list2){
        ListNode *dummyhead = new ListNode(0);
        ListNode *cur = dummyhead;
        while(list1 && list2){
            if(list1->val <= list2->val){
                cur->next = list1;
                list1 = list1->next;
            }else{
                cur->next = list2;
                list2 = list2->next;
            }
            cur = cur->next;
        }
        cur->next = list1 ? list1 : list2;
        return dummyhead->next;
    }
    // 找到链表的中间节点
    ListNode *findMid(ListNode *head, ListNode *end){
        ListNode *fast=head, *slow=head;
        while(fast!=end && fast->next!=end){
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }
    // 归并排序
    ListNode *mergeSort(ListNode *head, ListNode *end){
        // end_cond
        if(!head) return head;
        if(head->next == end){
            head->next = nullptr;
            return head;
        } 
        // find mid
        ListNode *mid = findMid(head, end);
        // group
        ListNode *list_l = mergeSort(head, mid);
        ListNode *list_r = mergeSort(mid, end);
        // merge
        return mergeList(list_l, list_r);
    }
public:
    // 以O(nlogn)时间复杂度, O(1)空间复杂度 排序链表
    ListNode *sortList(ListNode *head) {
        return mergeSort(head, nullptr);
    }
};
相关推荐
拾光Ծ21 小时前
【C++高阶数据结构】红黑树
数据结构·算法
Qiuner1 天前
《掰开揉碎讲编程-长篇》重生之哈希表易如放掌
数据结构·算法·leetcode·力扣·哈希算法·哈希·一文读懂
艾莉丝努力练剑1 天前
【C++模版进阶】如何理解非类型模版参数、特化与分离编译?
linux·开发语言·数据结构·c++·stl
立志成为大牛的小牛1 天前
数据结构——二十五、邻接矩阵(王道408)
开发语言·数据结构·c++·学习·程序人生
编程岁月1 天前
java面试-0215-HashMap有序吗?Comparable和Comparator区别?集合如何排序?
java·数据结构·面试
木井巳1 天前
[Java数据结构与算法]详解排序算法
java·数据结构·算法·排序算法
he___H1 天前
数据结构-移位
数据结构
电子_咸鱼1 天前
LeetCode——Hot 100【电话号码的字母组合】
数据结构·算法·leetcode·链表·职场和发展·贪心算法·深度优先
仰泳的熊猫1 天前
LeetCode:785. 判断二分图
数据结构·c++·算法·leetcode
haoly19891 天前
数据结构和算法篇-归并排序的两个视角-迭代和递归
数据结构·算法·归并排序