【刷题笔记10.5】LeetCode:排序链表
LeetCode:排序链表
一、题目描述
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。



二、分析
这题咱们默认要求:空间复杂度为O(1)。所以这把咱们用自底向上的方法实现归并排序,则可以达到O(1) 的空间复杂度。
具体算法如下:
1、首先,判断如果所给的 head 为 null 则返回null
2、求出所给链表head的长度length,然后将链表拆分成子链表进行合并。具体算法如下:
- 2.1、用subLen表示每次需要排序的子链表的长度,初始值subLen为1.
- 2.2、每次将链表拆分成若干个长度为subLen的子链表(最后一个子链表的长度可以小于subLen),按照每两个子链表一组进行合并(通过使用合并两个有序链表的做法),合并后即可得到若干个长度为 subLen2 的有序子链表(最后一个子链表的长度可以小于 subLen2)。合并两个子链表仍然使用合并两个有序链表的做法。
- 2.3、将subLen的值加倍(通过位运算左移1位的方式),重复第2步,对更长的有序子链表进行合并操作,直到有序子链表的长度大于或等于length,整个链表排序完毕。
如何保证每次合并后得到的子链表都是有序的呢?可以通过数学归纳法证明。
-
1、初始时subLen为1,每个长度为1的子链表都是有序的
-
2、如果每个长度为subLen的子链表已经有序,那么合并两个长度为subLen的子链表后,得到长度为subLen * 2
的子链表,一定也是有序的。 -
3、当最后一个子链表的长度小于subLen时,该子链表也是有序的,合并两个链表之后得到的子链表一定也是有序的。
三、上代码
public class Deal11 {public ListNode sortList(ListNode head) {if (head == null) {return null;}//1、从头向后遍历链表,统计链表长度int length = 0;ListNode p = head;while(p != null) {length++;p=p.next;}//2、设定result用于记录最终返回结果,并对其进行最终的初始化ListNode result = new ListNode(-1);result.next = head;//3、将链表拆分成若干个长度为subLen的子链表,并按照没两个子链表一组进行合并for (int subLen = 1; subLen < length; subLen <<= 1) {//将subLen的值加倍(通过位运算左移1位的方式)ListNode pre = result;ListNode cur = result.next; //用于记录拆分链表的位置while (cur != null) { //如果链表没有被拆完//3.1 拆分出链表1,其长度为subLenListNode head_1 = cur; //第一个链表的头,即curfor (int i = 1; i < subLen && cur != null && cur.next != null; i++) {cur = cur.next;}//3.2 拆分出链表2,其长度也为subLenListNode head_2 = cur.next; //第二个链表的头,即第一个链表尾部的下一个位置cur.next = null; //断开第一个链表和第二个链表的连接cur = head_2; //第二个链表的头重新赋给curfor (int i = 1; i < subLen && cur != null && cur.next != null; i++) {cur = cur.next;}//3.3 再次断开第二个链表的的连接ListNode next = null;if (cur != null) {next = cur.next; //用于记录拆分完两个链表后结束的后序位置cur.next = null;}//3.4 合并两个有序链表head_1 和 head_2ListNode merge = mergeTwo(head_1, head_2);pre.next = merge;while (pre.next != null) {pre = pre.next;}cur = next;}}return result.next;}//合并两个有序链表public ListNode mergeTwo(ListNode head1, ListNode head2) {ListNode result = new ListNode(-1);ListNode p = result;ListNode p1 = head1;ListNode p2 = head2;while(p1 != null && p2 != null) {if (p1.val > p2.val) {p.next = p2;p2 = p2.next;} else {p.next = p1;p1 = p1.next;}p = p.next;}if (p1 == null) {p.next = p2;}if (p2 == null) {p.next = p1;}return result.next;}
}相关文章:
【刷题笔记10.5】LeetCode:排序链表
LeetCode:排序链表 一、题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 二、分析 这题咱们默认要求:空间复杂度为O(1)。所以这把咱们用自底向上的方法实现归并排序,则可以达到O(1) 的空间复杂…...
三、【色彩模式与颜色填充】
文章目录 Photoshop常用的几种颜色模式包括:1. RGB模式2. CMYK模式3. 灰度模式4. LAB模式5. 多通道模式 Photoshop颜色填充1.色彩基础2.拾色器认识3.颜色填充最后附上流程图: Photoshop常用的几种颜色模式包括: 1. RGB模式 详细可参考&…...
karmada v1.7.0安装指导
前言 安装心得 经过多种方式操作,发现二进制方法安装太复杂,证书生成及其手工操作太多了,没有安装成功;helm方式的安装,v1.7.0的chart包执行安装会报错,手工修复了报错并修改了镜像地址,还是各…...
OK3568 forlinx系统编译过程及问题汇总
1. 共享文件夹无法加载;通过网上把文件夹加载后,拷贝文件很慢,任务管理器查看发现硬盘读写速率很低。解决办法:重新安装vmware tools。 2. 拷贝Linux源码到虚拟机,解压。 3. 虚拟机基本库安装 forlinxubuntu:~$ sudo…...
JVM篇---第五篇
系列文章目录 文章目录 系列文章目录一、简述Java的对象结构二、如何判断对象可以被回收?三、JVM的永久代中会发生垃圾回收么?一、简述Java的对象结构 Java对象由三个部分组成:对象头、实例数据、对齐填充。 对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码…...
C/C++ 排序算法总结
1.冒泡排序 https://blog.csdn.net/weixin_49303682/article/details/119365319 1 #include <stdio.h>2 3 #define N 94 5 void print(int a[])6 {7 for(int i 0; i < N; i)8 {9 printf("%d ", a[i]); 10 } 11 printf("…...
机器学习---RBM、KL散度、DBN
1. RBM 1.1 BM BM是由Hinton和Sejnowski提出的一种随机递归神经网络,可以看做是一种随机生成的 Hopfield网络,是能够通过学习数据的固有内在表示解决困难学习问题的最早的人工神经网络之 一,因样本分布遵循玻尔兹曼分布而命名为BM。BM由二…...
(c语言)有序序列合并
#include<stdio.h>//输入包含三行 //第一行包含两个正整数n,m,用空格分割,n表示第二行第一个升序序列中 //数字的个数,m表示第三行第二个升序序列中数字的个数 //第二行包含n个整数,用空格分割 //第三行包含m个整数,用空格分割 //输出…...
小谈设计模式(18)—适配器模式
小谈设计模式(18)—适配器模式 专栏介绍专栏地址专栏介绍 适配器模式角色分析目标接口(Target)源接口(Adaptee)适配器(Adapter) 核心思想应用场景Java程序实现输出结果程序分析123 优…...
Python柱形图
柱形图 柱形图,又称长条图、柱状统计图、条图、条状图、棒形图,是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析…...
用OpenCV(Python)获取图像的SIFT特征
import cv2 as cv import numpy as np import matplotlib.pyplot as plt imgcv.imread("../Lena.png") img_graycv.cvtColor(img,cv.COLOR_BGR2GRAY)#创建一个SIFI对象 siftcv.SIFT_create()#使用SIFT对象在灰度图像img_gray中检测关键点,结果存储在变量k…...
阿里云ECS和轻量服务器有什么区别?
阿里云服务器ECS和轻量应用服务器有什么区别?轻量和ECS优缺点对比,云服务器ECS是明星级云产品,适合企业专业级的使用场景,轻量应用服务器是在ECS的基础上推出的轻量级云服务器,适合个人开发者单机应用访问量不高的网站…...
华为云云耀云服务器L实例评测|安装搭建学生成绩管理系统
1.前言概述 华为云耀云服务器L实例是新一代开箱即用、面向中小企业和开发者打造的全新轻量应用云服务器。多种产品规格,满足您对成本、性能及技术创新的诉求。云耀云服务器L实例提供丰富严选的应用镜像,实现应用一键部署,助力客户便捷高效的在…...
Audacity 使用教程:轻松录制、编辑音频
Audacity 使用教程:轻松录制、编辑音频 1. 简介 Audacity 是一款免费、开源且功能强大的音频录制和编辑软件。它适用于 Windows、Mac 和 Linux 等多种操作系统,适合音乐制作、广播后期制作以及普通用户进行音频处理。本教程将带领大家熟悉 Audacity 的…...
深入了解“注意力”和“变形金刚”-第2部分
一、说明 在上一个故事中,我已经解释了什么是注意力机制,以及与转换器相关的一些重要关键字和块,例如自我注意、查询、键和值以及多头注意力。 在这一部分中,我将解释这些注意力块如何帮助创建转换器网络,并详细讨论网…...
“债务飙升!美国一天内增加2750亿美元,金融震荡的前奏已拉开帷幕!”
2023年10月4日,美国政府向美国债务追加2750亿美元,相当于现在比特币(BTC)总市值的一半还多。 有人会说:多一点、少一点,没什么区别.....确实,当你看美国债务时,2750亿美元并没有什么意义&#x…...
最新Uniapp软件社区-全新带勋章源码
测试环境:php7.1。ng1.2,MySQL 5.6 常见问题: 配置好登录后转圈圈,检查环境及伪静态以及后台创建好应用 上传图片不了,检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图,在前端uitl文件夹里面…...
基于goravel的CMS,企业官网通用golang后台管理系统
2023年9月11日10:47:00 仓库地址: https://gitee.com/open-php/zx-goravel-website 框架介绍 Goravel SCUI 后端开发组件 go 1.20 Goravel 1.13 数据库 sql(使用最新日期文件) goravel\doc\sql_bak mysql 8.0 前端开发组件 scui 1.6.9 node v14.21.3 效果图…...
(五)激光线扫描-位移台标定
线激光属于主动测量方式,但是由于线激光的特性,我们只能通过提取激光中心线获取这一条线上的高度信息,那么要进行三维重建的话,就需要通过平移或者是旋转的方式,来让线激光扫描被测物体的完整轮廓,也就是整个表面。激光线的密度越高还原出来的物体越细腻,但由于数据量大…...
媒体发稿:为什么选择国内媒体推广一文带你领略其魅
随着互联网的飞速发展,媒体推广成为企业宣传的重要方式。国内媒体推广因其独特的魅力和广泛的传播渠道,逐渐成为企业选择的首选。本文将探讨为什么选择国内媒体推广,并带您领略其魅力。 1. 国内媒体推广的广泛传播渠道 国内媒体推广拥有广泛…...
Sumi-e风格出图模糊、缺骨法、无气韵?手把手修复4类典型失败案例,含可复用的--s 800+ --style raw进阶参数包
更多请点击: https://intelliparadigm.com 第一章:Sumi-e风格在Midjourney中的本质困境与美学断层 水墨精神与扩散模型的结构性冲突 Sumi-e(日本水墨画)的核心在于“留白即墨、飞白见气、一笔三变”,其审美依赖于笔触…...
ChatGPT对话转Markdown工具:自动化构建个人知识库
1. 项目概述:从聊天记录到结构化文档的转换利器如果你和我一样,经常在各类聊天工具里和ChatGPT、Claude这类大模型进行深度对话,那么你一定遇到过这个痛点:一段精彩的、充满洞见的对话,最终只能以杂乱的、非结构化的文…...
基于OpenClaw的MacOS自动化AI助手:架构、配置与实战
1. 项目概述:一个为MacOS设计的自动化AI助手 最近在折腾桌面自动化,特别是想把一些高频、重复的跨应用操作给整合起来。比如,我经常需要在Telegram或WhatsApp上接收消息,然后根据内容去浏览器查资料、整理到笔记软件,或…...
C# 从零开发 MCP 工具基础教程
在C#编程领域,MCP(Managed Code Programming,托管代码编程)工具能极大提升开发效率与代码管理能力。无论是代码分析、自动化构建,还是调试辅助,一款实用的MCP工具都能成为开发者的得力助手。本教程将带你从…...
Claude长文档推理能力跃迁全记录(2024–2026技术演进图谱)
更多请点击: https://intelliparadigm.com 第一章:Claude 2026长文档推理能力的定义与边界 Claude 2026 的长文档推理能力指其在单次上下文窗口内(最大支持 2,000,000 tokens)对跨章节、多模态混合结构化文本(含嵌入表…...
计算机视觉入门:从OpenCV到PyTorch的实践指南
1. 项目概述:从“萌芽”到“入行”的视觉之旅 “对计算机视觉的萌芽迷恋”——这个标题精准地捕捉了无数技术爱好者,包括我自己,最初踏入这个领域时的心路历程。它描述的是一种状态:你或许被一张AI生成的艺术图片所震撼ÿ…...
三步搞定:iPaaS系统集成自动化配置实战
2025年,全球集成平台即服务(iPaaS)市场规模达到156.3亿美元,预计到2034年将增长至1087.6亿美元,年复合增长率高达24.20%。(数据来源:Fortune Business Insights,2026年2月࿰…...
思科路由器远程管理保姆级教程:从IP配置到Telnet/SSH登录全流程(避坑line vty和密码设置)
思科路由器远程管理全流程实战指南:从基础配置到安全登录 刚接触思科设备时,最让人头疼的莫过于那一连串看似晦涩的命令行操作。记得我第一次尝试配置路由器远程访问时,明明按照教程一步步操作,却始终无法通过Telnet连接ÿ…...
书匠策AI让我的课程论文从“赶死线“变成了“喝茶局“
先交代背景。 上个月,我接了一个"极限挑战":一周五门课,四门要交课程论文,最短的截止日期只剩48小时。 说实话,那一刻我脑子里只有两个字——完蛋。 但作为一个天天教别人写论文的博主,我总不…...
2026年度能耗监测系统的深度分析与展望
在当前全球可持续发展的大背景下,能耗监测系统的重要性愈发凸显。随着技术的进步和社会对节能减排的需求,2026年度的能耗监测系统将迎来一场技术革命和应用升级。本文将从市场需求、技术现状、未来发展方向及实施策略等多个方面,对2026能耗监…...
