当前位置: 首页 > news >正文

排序链表--字节跳动

少年的书桌上没有虚度的光阴

题目描述

请你对链表进行排序

思路分析

  • 核心思想:归并排序

有三个部分

链表排序实现

1. merge 函数

21.见 合并两个有序链表,

  • 首先创建一个虚拟头节点 newhead,并使用指针 tail 来构建合并后的链表。

  • 通过循环比较 list1list2 节点的值,将较小值的节点连接到 tail 后面,并相应地移动指针。

  • 当其中一个链表遍历完后,将另一个链表的剩余部分直接连接到 tail 后面。

  • 最后返回虚拟头节点的下一个节点,即合并后链表的头节点。

2. findMiddle 函数

该函数用于寻找链表的中间节点,采用快慢指针的方法:

  • fast 指针每次移动两步,slow 指针每次移动一步。

  • fast 指针到达链表末尾时,slow 指针就指向链表的中间节点。

3. sortList 函数

这是核心的排序函数,使用归并排序算法对链表进行排序:

  • 首先判断链表是否为空或只有一个节点,如果是则直接返回该链表。

  • 调用 findMiddle 函数找到链表的中间节点,将链表分成左右两部分。

  • 递归地对左右两部分链表分别调用 sortList 函数进行排序。

  • 最后调用 merge 函数将两个有序的子链表合并成一个有序链表。

完整代码

class Solution {
public:
    // 合并两个有序链表
    ListNode* merge(ListNode* list1, ListNode* list2) {
        auto  newhead = new ListNode(0); // 使用明确的类型名称
        auto  tail = newhead;

        while (list1 && list2) {
            if (list1->val < list2->val) {
                tail->next = list1;
                list1 = list1->next;
            } else {
                tail->next = list2;
                list2 = list2->next;
            }
            tail = tail->next;
        }

        tail->next = list1 ? list1 : list2; // 处理剩余部分
        return newhead->next;
    }

    // 寻找中间节点
    ListNode* findMiddle(ListNode* head) {
        ListNode* fast = head;
        ListNode* slow = head;

        while (fast->next && fast->next->next) {
            fast = fast->next->next;
            slow = slow->next;
        }

        return slow;
    }

    // 归并排序链表
    ListNode* sortList(ListNode* head) {
        if (head==NULL ||head->next==NULL) 
                return head; // 检查链表长度

        // 找到链表的中间节点
        ListNode* mid = findMiddle(head);
        ListNode* right = mid->next;
        mid->next = nullptr; // 切分链表

        // 递归地对左右两部分进行排序
        ListNode* l = sortList(head);
        ListNode* r = sortList(right);

        // 合并两个有序链表
        return merge(l, r);
    }
}
};

复杂度分析

  • 时间复杂度: O(nlogn)

  • 空间复杂度: O(logn)

相关文章:

  • Pytorch框架03-网络的搭建(nn.Module/卷积层/池化层/非线性激活/线性层/CIFAR-10分类模型搭建)
  • devops 工具 网络安全
  • Java数据结构-排序
  • 微信小程序-组件复用机制behaviors
  • Mono里运行C#脚本43—System.Console.WriteLine()函数的生成过程
  • ThinkORM模型静态方法create好像对MongoDB不支持
  • 深度学习-7.超参数优化
  • CSS按钮点击效果实战:scale(0.95) 与10个交互动画优化指南
  • 体育品牌排行榜前十名:MLB·棒球1号位
  • 【含开题报告+文档+PPT+源码】基于springboot加vue 前后端分离的校园新闻审核发布管理系统
  • linux常用基础命令_最新版
  • Apifox 增强 AI 接口调试功能:自动合并 SSE 响应、展示DeepSeek思考过程
  • 这个 Python 库,隐藏了你不知道的数据库操作技巧
  • @media 的常用场景与示例
  • [ProtoBuf] 介绍 | 保姆级win/linux安装教程
  • Windows 11 使用容器(Docker Podman)
  • git如何打patch
  • netty基础知识梳理和总结
  • Python爬虫实战:爬取豆瓣电影
  • 公文派2025:免费社区版重大安装更新!
  • 中日有关部门就日本水产品输华问题进行第三次谈判,外交部回应
  • 中日有关部门就日本水产品输华问进行第三次谈判,外交部回应
  • 代理销售保险存在误导行为,农业银行重庆市分行相关负责人被罚款0.1万元
  • 中华人民共和国和俄罗斯联邦在纪念中国人民抗日战争、苏联伟大卫国战争胜利和联合国成立80周年之际关于进一步深化中俄新时代全面战略协作伙伴关系的联合声明
  • 梅花奖在上海|第六代“杨子荣”是怎样炼成的?
  • 司法部:加快研究制定行政执法监督条例,建立完善涉企行政执法监督长效机制