排序链表 - LeetCode 热题 33

大家好!我是曾续缘😹

今天是《LeetCode 热题 100》系列

发车第 33 天

链表第 12 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表

    示例 1:

    输入:head = [4,2,1,3]
    输出:[1,2,3,4]
    

    示例 2:

    输入:head = [-1,5,3,4,0]
    输出:[-1,0,3,4,5]
    

    示例 3:

    输入:head = []
    输出:[]
    

    提示:

    • 链表中节点的数目在范围 [0, 5 * 104] 内
    • -105 <= Node.val <= 105

    进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

    难度:💖💖

    解题方法

    这道题目是要求对链表进行排序,要求使用 O(nlogn) 的时间复杂度和常数级的空间复杂度。给定的是单向链表的头结点 head,需要返回排序后的链表。

    我们使用经典的归并排序来解决这个问题,需要说明的是,下面的是递归版本,并不符合常数级的空间复杂度。归并排序的基本思想是将链表分成两部分,然后分别对这两部分进行排序,最后再合并这两部分成一个有序的链表。

    步骤如下:

    1. 首先,在 sortList 方法中,先判断特殊情况,即如果链表为空或者只有一个节点,则直接返回该链表,因为它已经是有序的。
    2. 然后,通过快慢指针的方法找到链表的中间节点(slow 指针),将链表一分为二,分别用 lbeginrbegin 表示左右两部分的链表头。
    3. 接下来,递归地对左右两部分链表调用 sortList 方法,直到无法再分割(即链表为空或者只有一个节点)。这样就实现了将原始链表分成了若干个小的有序链表。
    4. 最后,将左右两部分的有序链表通过 mergeTwoLists 方法进行合并,得到最终的有序链表,mergeTwoLists 方法在 LeetCode 的 21. 合并两个有序链表 中有实现过。

    Code

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode sortList(ListNode head) {
            if(head == null || head.next == null){
                return head;
            }
            ListNode fast = head.next, slow = head;
            while(fast != null && fast.next != null){
                fast = fast.next.next;
                slow = slow.next;
            }
            ListNode rhead = slow.next;
            slow.next = null;
            ListNode lbegin = sortList(head);
            ListNode rbegin = sortList(rhead);
            return mergeTwoLists(lbegin, rbegin);
        }
    
        public ListNode mergeTwoLists(ListNode list1, ListNode list2) { // 21.合并两个有序链表
            if(list1 == null){
                return list2;
            }else if(list2 == null){
                return list1;
            }else if(list1.val < list2.val){
                list1.next = mergeTwoLists(list1.next, list2);
                return list1;
            }else{
                list2.next = mergeTwoLists(list1, list2.next);
                return list2;
            }
        }
    }
    

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/546694.html

    如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

    相关文章

    带你追踪 ICASSP 2024会议现场 韩国夜景令人陶醉

    会议之眼 快讯 昨天&#xff0c;2024年的ICASSP&#xff08;International Conference on Acoustics, Speech, and Signal Processing&#xff09;即国际声学、语音和信号处理会议已经在韩国首尔拉开帷幕&#xff01;吸引了众多热情的与会者&#xff01;本届ICASSP会议举办日期…

    实验笔记之——RGBD GS-ICP SLAM配置与测试

    《RGBD GS-ICP SLAM》是最新开源的一个3DGS-SLAM工作&#xff0c;通过利用GICP来实现当前帧gaussian与已mapping的gaussian进行匹配进行位姿的估算&#xff0c;并通过关键帧的选择策略来进一步提升performance~ Use G-ICP to align the current frame with the 3D GS map whic…

    Redis消息队列-基于PubSub的消息队列

    7.3 Redis消息队列-基于PubSub的消息队列 PubSub&#xff08;发布订阅&#xff09;是Redis2.0版本引入的消息传递模型。顾名思义&#xff0c;消费者可以订阅一个或多个channel&#xff0c;生产者向对应channel发送消息后&#xff0c;所有订阅者都能收到相关消息。 SUBSCRIBE …

    OpenHarmony实战开发-图片选择和下载保存案例。

    介绍 本示例介绍图片相关场景的使用&#xff1a;包含访问手机相册图片、选择预览图片并显示选择的图片到当前页面&#xff0c;下载并保存网络图片到手机相册或到指定用户目录两个场景。 效果图预览 使用说明 从主页通用场景集里选择图片选择和下载保存进入首页。分两个场景点…

    Linux的重要命令(二)+了解Linux目录结构

    目录 一.Linux的目录结构 二.查看文件内容命令 1.cat 命令 2.more 命令 3.less 命令 4.head 命令 5.tail 命令 6.拓展 head 和 tail 的其他用法 ​编辑 三.统计文件内容的命令-wc ​编辑 四.检索和过滤文件内容的命令-grep ​编辑 ​编辑 五.压缩命令 gzip 和 bz…

    Canvas 画布基本用法详解

    Canvas 画布 HTML中的 <canvas> 标签用于动态绘制图形&#xff0c;所有在<canvas>中的画图必须用JavaScript完成。 <canvas>标签是透明的&#xff0c;它是图形的容器&#xff0c;必须使用脚本才能实际绘制图形。 绘制一个简单的矩形 <!-- canvas标签&a…

    Python基于卷积神经网络的车牌识别系统

    博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

    【数据结构与算法】递推

    来源&#xff1a;《信息学奥赛一本通》 所谓递推&#xff0c;是指从已知的初始条件出发&#xff0c;依据某种递推关系&#xff0c;逐次推出所要求的各中间结果及最后结果。其中初始条件或是问题本身已经给定&#xff0c;或是通过对问题的分析与化简后确定。 从已知条件出发逐…

    jenkins(docker)安装及应用

    jenkins Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行&#xff08;这个比较抽象&#xff0c;暂且写上&#xff0c;不做解…

    论坛直击|发展新质生产力,高校怎么做?

    新质生产力浪潮涌动 三大议题聚焦高校人才培养 今年全国两会的政府工作报告将“大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”列在2024年政府工作任务首位&#xff0c;发展新质生产力的先导是培养拔尖创新人才&#xff0c;高等教育改革必须以立德树人为根本任…

    幽灵漏洞进阶版来了

    近日&#xff0c;网络安全研究人员披露了针对英特尔系统上 Linux 内核的首个原生 Spectre v2 漏洞&#xff0c;该漏洞是2018 年曝出的严重处理器「幽灵」&#xff08;Spectre&#xff09;漏洞 v2 衍生版本&#xff0c;利用该漏洞可以从内存中读取敏感数据&#xff0c;主要影响英…

    Java怎么获取今天最早的时间

    今天在实现项目里的一个功能的时候&#xff0c;需要获取今天最早的时间&#xff0c;比如今天是2024-4-15&#xff0c;则今天的开始时间为2024-4-14日24点之后&#xff08;2024-4-15零点&#xff09;的那个时间点。 这篇文章就分享一下博主获取这个时间的方法&#xff1a; 很简…

    Python数据可视化库—Bokeh与Altair指南【第161篇—数据可视化】

    &#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在数据科学和数据分析领域&#xff0c;数据可视化是一种强大的工具&#xff0c;可以帮助我们…

    代码随想录刷题day53|最长公共子序列不相交的线最大子序和

    文章目录 day53学习内容一、最长公共子序列1.1、动态规划五部曲1.1.1、 确定dp数组&#xff08;dp table&#xff09;以及下标的含义1.1.2、确定递推公式1.1.3、 dp数组如何初始化1.1.4、确定遍历顺序1.1.5、输出结果 1.2、代码 二、不相交的线2.1、动态规划五部曲2.1.1、 确定…

    【Git】Git的安装与常用命令

    Git的安装与常用命令 一、Git的安装 &#xff08;一&#xff09;下载 官网下载&#xff1a;https://git-scm.com/downloads 镜像网站&#xff1a;https://registry.npmmirror.com/binary.html?pathgit-for-windows/ &#xff08;二&#xff09;安装 双击安装&#xff0c…

    智能客服系统如何高效分配会话的实用指南

    面对现在快节奏的商业市场&#xff0c;能否快速地把握住商机成为了企业制胜的关键&#xff0c;所以很多企业都想要一个可以快速响应客户需求的工具来帮助他们实现更高效的转化。如果能够有一个可以智能识别并自动将客户分配给合适客服的系统&#xff0c;来保证每个客户都能享受…

    抖音扫码登录

    抖音扫码登录&#xff0c;ck可以点赞关注上传视频 主要涉及参数: bd_ticket_guard_client_data bd_ticket_guard_server_data bd_ticket_guard_ree_public_key bd_ticket_crypt_cookie x–secadk–csrf–token req_sign abogus ts_sign ticket {"is_digg":…

    从工程师到医疗高管,复旦MBA助我实现职场飞跃 | 校友故事

    2月12日&#xff0c;英国《金融时报》&#xff08;FT&#xff09;发布2024年全球MBA项目百强榜单&#xff0c;复旦大学MBA项目位列全球第27位&#xff0c;并在多个分指标上位居全球前列。其中“职业服务”和“ESG与零排放教学”蝉联亚洲第1、“薪酬增长率”全球第2、“职业成长…

    “智能医疗新纪元:机器学习在医疗健康领域的创新应用“

    个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

    [docker] 核心知识 - 容器/镜像的管理和操作

    [docker] 核心知识 - 容器/镜像的管理和操作 想要查看完整的指令&#xff0c;可以通过 docker --help 列举所有的指令&#xff0c;这里会提到一些比较常用的核心指令 查看容器的状态 这个应该是最常用的指令&#xff0c;语法为 docker ps&#xff0c; ps 为 process status …