leetcode:排序链表(递归)

题目:

给定链表的头结点 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

代码+思路(注释):

class Solution {
public ListNode sortList(ListNode head) {
        //直接调用最后结果:head是头,tail==null;也就是结尾null
        return sort(head,null);
    }

    public ListNode mergeTwoLists(ListNode list1,ListNode list2) {
        //归并排序的思想
        //在下一个函数中我们要掉用他
        //这个是合并排序两个升序链表
        //后面我们要切割链表,使他成为2个升序链表
        if (list1 == null) {
            return list2;
        }
        if (list2 == null) {
            return list1;
        }
        ListNode dammyHead = new ListNode(Integer.MAX_VALUE);//虚拟头结点
        ListNode pre = dammyHead;//动的结点//也是新链表的指针
        ListNode cur1 = list1;//两个指针
        ListNode cur2 = list2;
        //开始向新链表插入
        while (cur1 != null && cur2 != null) {
            if (cur1.val > cur2.val) {
                pre.next = cur2;
                cur2 = cur2.next;
            } else {
                pre.next = cur1;
                cur1 = cur1.next;
            }
            pre = pre.next;
        }
        if (cur1 == null) {
            pre.next = cur2;
        }//因为是排好序的2个链表
        else {
            pre.next = cur1;
        }
        return dammyHead.next;//返回虚拟头结点后面部分
    }

    public ListNode sort(ListNode head,ListNode tail){
        //因为链表本身没有排序
        if(head==null){
            return head;
        }
        if(head.next==tail){
            head.next=null;
            return head;
        }
        ListNode node1=head;//两个指针
        //一个快,一个慢
        ListNode node2=head;
        //找中间结点
        while(node2!=tail){
            node1=node1.next;
            node2=node2.next;
            if(node2!=tail){
                node2=node2.next;
            }
        }
        //多次调用sort,每次把各部分再分割
        //在调用合并(归并)函数//每次排一部分
        return mergeTwoLists(sort(head,node1),sort(node1,tail));
    }
}

结果:

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

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

相关文章

【原创】linux为什么不是实时操作系统

文章目录 一、什么是实时操作系统&#xff08;RTOS&#xff09;&#xff1f;二、linux为什么不是实时操作系统&#xff1f;中断响应时间中断处理时间任务调度时间1、No Forced Preemption(Server)2、Voluntary Kernel Preemption(Desktop)3、Preemptible Kernel(Low-Latency De…

yarn集群HDFS datanode无法启动问题排查

一、问题场景 hdfs无法访问&#xff0c;通过jps命令查看进程&#xff0c;发现namenode启动成功&#xff0c;但是所有datanode都没有启动&#xff0c;重启集群&#xff08;start-dfs.sh&#xff09;后仍然一样 二、原因分析 先看下启动的日志有无报错。打开Hadoop的日志目录 …

Java实现考研专业课程管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

系统登录的时候的密码如何做到以加密的形式进行登录【java.security包下的api】工具类。

/** description: 将普通的publicKey转化得到一个RSAPublicKey* author: zkw* date: 2024/1/24 16:17* param: publicKey 普通的publicKey* return: RSAPublicKey 得到一个新的RSAPublicKey**/public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorit…

【进阶之路】如何提升 Java 编程内力?

如何提升 Java 编程内力&#xff1f; 可能很多初学者在学完 SpringBoot 之后&#xff0c;做了 1-2 个项目之后&#xff0c;不知道该去学习什么了&#xff0c;其实这时候需要去学习的东西还有很多&#xff0c;接下来我会列举一下主要需要从哪些方面来对 Java 编程深入学习&#…

C++补充篇- C++11 及其它特性

目录 explicit 关键字 左值和右值的概念 函数返回值当引用 C11 新增容器 - array C的类型转换 static_cast reinterpret_cast dynamic_cast const_cast C智能指针 auto_ptr 使用详解 (C98) unique_ptr 使用详解 (C11) auto_ptr的弊端 unique_ptr严谨auto_ptr的弊端 unique_…

网安培训第二期——sql注入+中间件+工具

文章目录 宽字节注入插入注入二次注入PDO模式(动态靶机&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;)sql注入读取文件sql注入导出文件linux命令 10.12笔记sqlmapsqlmap参数 10.13笔记sqlmap 文件读写前后缀常用tamper及适用场景 10.…

SpringMVC-RESTFul

文章目录 RESTFul一、基础概念二、增删改查1.查询全部用户信息 &#xff08;GET&#xff09;2.根据id查询用户信息3.添加用户&#xff08;POST&#xff09;4.修改用户 &#xff08;PUT&#xff09;5.删除用户 &#xff08;DELETE&#xff09; RESTFul 一、基础概念 二、增删改…

Qt Designer教程

文章目录 创建一个 ui 文件选择控件Qt Designer基本控件介绍1、Layouts1.1、Layouts 布局1.2、参数配置 2、Spacers2.1、 Spacers 弹簧介绍2.2、 参数设置 3、Buttons 按键3.1、 Buttons 按键分类 4、Item Views&#xff08;Model-Based&#xff09; 项目视图(基于模型)4.1、 B…

高质量简历模板网站,免费、免费、免费

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…

shell脚本基础之条件语句详解

目录 一、条件语句 1、测试 1.1 测试判断 ​1.2 比较整数数值 1.3 字符串比较 1.4 双中括号的用法 1.5 () 与 {} 的用法及区别 2、if语句 2.1 单分支if语句 2.2 双分支if语句 2.3 多分支if语句 2.4 shell脚本的if语句案例 案例一 案例二 案例三 案例四 案例五…

c++day1作业

思维导图 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include <iomanip> using namespace std; int main() {string a;cout<<"输入一个字符…

vue3-深入组件-组件注册和props更多细节

组件注册 定义好的组件需要注册才能被使用。 注册方式有两种 全局注册 局部注册 全局注册 .component() 方法&#xff0c;让组件在当前 Vue 应用中全局可用。 在 main.ts 中 import ./assets/main.cssimport { createApp } from vue import { createPinia } from pinia i…

一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会名单

四川城市职业学院和陈老师在序号&#xff1a;158&#xff0c;300 一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会名单 各相关单位&#xff1a; 一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会于2023年11月12日正式成立。经各单位申请、大数据…

kafka-顺序消息实现

kafka-顺序消息实现 场景 在购物付款的时候&#xff0c;订单会有不同的订单状态&#xff0c;对应不同的状态事件&#xff0c;比如&#xff1a;待支付&#xff0c;支付成功&#xff0c;支付失败等等&#xff0c;我们会将这些消息推送给消息队列 &#xff0c;后续的服务会根据订…

数据的存储结构

1.类别 顺序存储、链式存储、散列存储、索引存储 2.顺序存储与链式存储的区别 顺序存储链式存储优点 可以实现随机存取每个元素占用最少的空间 充分利用所有存储单元&#xff0c;不会出现碎片现象。缺点 只能使用整块的存储单元&#xff0c;会产出较多的碎片。 需要额外的存…

12.for 条件循环语句 (3)

for 循环语句 允许脚本一次性读取多个信息&#xff0c;然后逐一对信息进行操作处理。当要处理的数据有范围时&#xff0c;使用for循环语句。 使用 for 循环语句从列表文件中读取多个用户名&#xff0c;然后为其逐一创建用户账户并设 置密码。首先创建用户名称的列表文件users.…

Linux浅学笔记02

目录 grep-wc-管道符 echo-tail-重定向符 vi编辑器 grep-wc-管道符 grep命令(过滤文件内容) //更准确的来说&#xff0c;是筛选包括“所需字符”的一句内容或多句内容。 语法&#xff1a;grep [-n] 关键字 文件路径 //-n&#xff1a;可选&#xff0c;表示在结果中匹配的行…

如何防止联通光猫后台运营商远程自动改超管密码

环境: 联通光猫 ZXHN F677V9 硬件版本号 V9.0 软件版本号 V9.0.0P1T3 U盘16G 笔记本电脑 问题描述: 如何防止联通光猫后台运营商远程自动改超管密码 家里用的是ZXHN F677V9 光猫,自己改了超级密码之后用了几次,最近就无法登录了,问了装维师傅说是最近统一改了,这还…

模型之大脑和计算机的模型化

大脑和计算机的模型化 “素数分解&#xff1a;悬而未决的问题与计算机科学的挑战” 计算机同样也可以看作由相互作用的各部分集合而成&#xff1b;很大程度上由于这个原因&#xff0c;理论计算机科学中同样有很多悬而未决的重要问题。其中有如下这样一个例子&#xff0c;我们…