LeetCode--HOT100题(33)

news2025/1/12 3:45:42

目录

  • 题目描述:148. 排序链表(中等)
    • 题目接口
    • 解题思路
    • 代码
  • PS:

题目描述:148. 排序链表(中等)

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

LeetCode做题链接:LeetCode-排序链表

示例 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(nlog n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

题目接口

/**
 * 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) {

    }
}

解题思路

参考题解:Sort List (归并排序链表)

思路:递归

  • 1.用二分法的方法将列表从中间分割,再把分割的列表继续从中间分割,分割到最小单位(快慢指针)
  • 2.递归终止条件: 当 head.next == None 时,说明只有一个节点了,直接返回此节点
  • 3.再返回两个分割列表的合并列表(合并有序列表)
    可以跟着这个图理解一下~
    在这里插入图片描述

代码

/**
 * 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) {
        // 1、递归结束条件
        if (head == null || head.next == null) {
            return head;
        }

        // 2、找到链表中间节点并断开链表 & 递归下探
        ListNode midNode = middleNode(head);
        ListNode rightHead = midNode.next;
        // 截断列表
        midNode.next = null;
        // 递归,不断下探到最深出最低端,再合并返回
        ListNode left = sortList(head);
        ListNode right = sortList(rightHead);

        // 3、当前层业务操作(合并有序链表)
        return mergeTwoLists(left, right);
    }

    //  找到链表中间节点(876. 链表的中间结点)
    private ListNode middleNode(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode slow = head;
        ListNode fast = head.next.next;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }

        return slow;
    }

    // 合并两个有序链表(21. 合并两个有序链表)
    private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode sentry = new ListNode(-1);
        ListNode curr = sentry;

        while(l1 != null && l2 != null) {
            if(l1.val < l2.val) {
                curr.next = l1;
                l1 = l1.next;
            } else {
                curr.next = l2;
                l2 = l2.next;
            }

            curr = curr.next;
        }

        curr.next = l1 != null ? l1 : l2;
        return sentry.next;
    }
}

PS:

感谢您的阅读!如果您觉得本篇文章对您有所帮助,请给予博主一个喔~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot项目集成ElasticSearch服务

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍优势说明集成过程1.引入依赖2.添加配置文件3.初始化 示例说明代码结果 总结提升 版本介绍 Spring boot的版本是&#xff1a; 2.3.12   ElasticSearch的版本是&#xff1a;7.6.2 背景介绍 在我们的项目中经常会遇到对于…

《Linux从练气到飞升》No.15 Linux 环境变量

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

Java算法_ 验证二叉搜索树(LeetCode_Hot100)

题目描述&#xff1a; 给你一个二叉树的根节点 &#xff0c;判断其是否是一个有效的二叉搜索树。root 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 获得…

iTOP-STM32MP157开发板编写驱动程序和应用程序

通过 40.1 章节的学习&#xff0c;我们已经把内核层和用户层实现数据交互的基本概念搞懂了&#xff0c;在上一章节的基础上我们编写驱动程序实现在内核层与应用层传数据。 新建 file_operation.c 文件在 Ubuntu 的/home/driver/04_file_operation 目录下&#xff0c;可以在上次…

基于Javaweb的摄影作品网站/摄影网站

摘 要 随着信息化时代的到来&#xff0c;系统管理都趋向于智能化、系统化&#xff0c;摄影作品网站也不例外&#xff0c;但目前国内的有些网站仍然都使用人工管理&#xff0c;浏览网站人数越来越多&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的…

智慧二维码门牌管理系统:便捷、高效、智能的服务体验

文章目录 前言一、便捷的获取信息和服务二、提升管理和服务效率三、地区定制化应用四、展望未来 前言 随着信息技术的飞速发展&#xff0c;人们的生活方式正在发生翻天覆地的变化。为了更好地适应这种变化&#xff0c;智慧城市建设项目应运而生&#xff0c;而其中智慧二维码门…

LRU算法源码实现

算法介绍&#xff1a; 最近最久未使用&#xff08;Least Recently Used LRU&#xff09;算法是⼀种缓存淘汰策略。该算法的思路是&#xff0c;将最近一段时间内最久未使用的页面置换出去。 升级版LRUK算法见 基于LRU-K算法设计本地缓存实现流量削峰https://blog.csdn.net/l…

如何通过时间跟踪改进项目管理?

领导一家成功企业难免面临一系列挑战&#xff1a;如未能制定清晰明确的目标、管理不善的团队成员、将错误的任务分配给错误的人……如果没有适当的项目管理&#xff0c;企业管理可能会举步维艰。 虽然提高项目管理技能的方法有很多&#xff0c;但最有效、最快捷的方法之一就是…

如何正确地设置Outlook SMTP发送电子邮件(wordpress配置)

如何正确地设置Outlook SMTP发送电子邮件&#xff08;wordpress配置&#xff09; 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://pay.xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 正在寻找正确的Outlook SMTP设置&#xff1f…

leetcode414. 第三大的数

题目&#xff1a; 给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a; 输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;第三大的数是 1 。 示例 2&#xff1a; 输入&#xff1a;[1, …

SAP 开启录制与回放功能(RZ11 : sapgui/user_scripting)<转载>

原文链接&#xff1a;https://www.pianshen.com/post/683635733189/#google_vignette 问题现象&#xff1a; 1、如下图&#xff0c;在SAP界面的定制本地布局菜单中&#xff0c;脚本录制和回放功能为灰色&#xff0c;无法进行点击操作&#xff0c;因此也无法进行本地脚本录制。 …

【前端】深入理解CSS定位

目录 一、前言二、定位组成1、定位模式1.1、静态定位static①、语法定义②、特点 1.2、相对定位relative①、语法定义②、特点③、代码示例 1.3、绝对定位absolute①、语法定义②、特点③、代码示例1&#xff09;、没有祖先元素或者祖先元素没有定位2&#xff09;、祖先元素有定…

关于内点定义不同的讨论

根据和译者联系后&#xff0c;根据提供P660页的关于内点的定义与其他国内教材不同。 《离散数学及其应用&#xff08;原书第8版&#xff09;》ISBN:978-7-111-63687-8内点定义如下图所示 因此 《离散数学及其应用&#xff08;原书第8版&#xff09;》ISBN:978-7-111-63687-8 第…

为自己的 SSM项目设计评论功能

为自己的 SSM项目设计评论功能 设计思路增加评论显示评论评论总数 设计思路 首先需要设计评论信息的实体类&#xff08;对应评论表&#xff09; 主要分为以下2个功能&#xff1a; 显示所有评论 当我们进入文章详情页的时候&#xff0c;页面就会通过 ajax 发送请求给服务器&…

电厂人员定位方案可以使用多种技术来实现

电厂人员定位方案可以使用多种技术来实现。以下是一个常见的电厂人员定位方案的步骤&#xff1a; 1.选取合适的定位技术&#xff1a;根据电厂的需求和运行环境&#xff0c;选择适合的定位技术&#xff0c;例如基于UWB&#xff08;Ultra-Wideband&#xff09;、RFID&#xff08…

Linux 黑话解析:什么是 LUKS 加密?

导读LUKS 是 Linux 用户中流行的磁盘加密机制。在这篇术语解析文章中&#xff0c;可以了解更多关于 LUKS 的信息。 计算机安全旨在保护私密信息。有许多方法可以保护系统。一些用户使用简单的用户名/密码登录方案进行基本保护。其他用户可能会通过加密以不同的方式增加额外的保…

Leetcode 剑指 Offer II 040. 矩阵中最大的矩形

题目难度: 困难 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个由 0 和 1 组成的矩阵 matrix &#xff0c;找出只包含 1…

c语言实现MD5算法

MD5加密 文章目录 MD5加密MD5介绍应用场景代码分析 &#xff08;基于qt5.14.2&#xff09;测试记录 MD5介绍 1。 一种单向加密算法&#xff0c;即对明文加密&#xff0c;而不能通过密文得到明文。对原数据的任何改动&#xff0c;哪怕是1字节&#xff0c;得到的MD5值都有很大的区…

C#系统锁屏事件例子 - 开源研究系列文章

今天有个网友问了个关于操作系统锁屏的问题。 我们知道&#xff0c;操作系统是基于消息和事件处理的&#xff0c;所以我们只要找到该操作系统锁屏和解屏的那个事件&#xff0c;然后在事件里进行处理即可。下面是例子介绍。 1、 项目目录&#xff1b; 下面是项目目录&#xff1a…