【Leetcode——排序的循环链表】
😊😊😊
文章目录
- 一、力扣题之排序循环链表
- 二、解题思路
- 1. 使用双指针法
- 2、找出最大节点,最大节点的下一个节点是最小节点,由此展开讨论
- 总结
一、力扣题之排序循环链表
题目如下:航班直达!!

二、解题思路
刚看到直到题我还是很迷的,没有写过类似的题目。
当我看到官方题解时,嘿嘿嘿三个字形容此时的心情。
首先需要知道,这道题是升序的,但是当我们找到最大节点时,最大节点的next是最小节点,这是循环链表的缘故
1. 使用双指针法
双指针在链表这块题目还是特别特别好用的。
定义一个cur指针指向头节点,next指针指向头节点的下一个节点,这是初始状态。
这里需要分几种情况来讨论,拿题目的样例来看:

对插入数据的大小不同,分为几种情况:
1)当 insertVal大于cur的值,并且insertVal小于next的值时,
此时insertVal介于cur和next之间,插入它们之间即可。
2)当insertVal大于cur的值,并且cur的值大于next的值时,
此时cur是链表中的MAX节点,next是链表中的MIN节点。
而insertVal大于MAX节点,所以只需在cur和next之间插入即可。
3)当cur大于next的值,表明cur是MAX节点,next是MIN节点,并且insertVal的值小于next的值,此时insertVal小于MIN,只需在cur和next之间插入即可。
以上三种情况:都是在cur和next之间插入。
4)而如果链表为空,更容易了,题目也已经给出,如果链表为空,只需要返回插入的节点即可。
Node*insertnode = (Node*)malloc(sizeof(Node));insertnode->val = insertVal;insertnode->next = NULL;//链表为空if(head == NULL){insertnode->next = insertnode;return insertnode;}
5)如果链表只有一个节点,那么也不用遍历了,在head后面插入即可,一定是有序的。
//只有一个节点if(head->next == head){insertnode->next = head;head->next = insertnode;return head;}
对于链表中的节点全部相同的情况,在哪里插入都可以,这种情况已经包含在上面三种情况的一种处理了,无需再单独处理。
总代码如下:
typedef struct Node Node;struct Node* insert(struct Node* head, int insertVal) {Node*insertnode = (Node*)malloc(sizeof(Node));insertnode->val = insertVal;insertnode->next = NULL;//链表为空if(head == NULL){insertnode->next = insertnode;return insertnode;}//只有一个节点if(head->next == head){insertnode->next = head;head->next = insertnode;return head;}//两个节点及以上struct Node*cur = head,*next = head->next;while(next!=head){//以下三种情况都是在cur和next之间插入if(cur->val<=insertVal && insertVal<=next->val){break;}else if(cur->val<=insertVal && cur->val>next->val){break;}else if(cur->val>next->val && insertVal<=next->val){break;}cur = next;next = next->next;}insertnode->next = next;cur->next = insertnode;return head;
}
2、找出最大节点,最大节点的下一个节点是最小节点,由此展开讨论
第一步1)先找出最大节点,最大节点的下一个节点是最小节点,分别记录下来。
第二步2)分情况讨论:情况与第一种方法差不多,唯一不同的是:
1、当insertVal大于最小值,并且insertVal小于最大值,此时需要从最小的节点开始遍历,直到找到第一个节点的val值大于insertVal,在该节点前面插入即可。
2、当insertVal大于cur的值,并且cur的值大于next的值时,
此时cur是链表中的MAX节点,next是链表中的MIN节点。
而insertVal大于MAX节点,所以只需在cur和next之间插入即可。
3、当cur大于next的值,表明cur是MAX节点,next是MIN节点,并且insertVal的值小于next的值,此时insertVal小于MIN,只需在cur和next之间插入即可。
同样,需要在前面考虑空链表的特殊情况,而一个节点的特殊情况下面可以处理。
struct Node* insert(struct Node* head, int insertVal)
{Node*insertnode = (Node*)malloc(sizeof(Node));insertnode->val = insertVal;insertnode->next = NULL;//特殊情况if(head == NULL){insertnode->next = insertnode;return insertnode;}//1.找到最大节点Node*maxnode = head, *cur = head,*next = head->next;int max = head->val;while(next!=head){if(max<=next->val){max = next->val;maxnode = next;}cur = next;next = next->next;}//找到最大节点了//最大节点的next就是最小节点Node*minnode = maxnode->next;//2.分情况讨论//1)如果insertnode的val大于最大的或者小于最小的,则插入点在最大和最小节点之间if(insertVal>=maxnode->val || insertVal<=minnode->val){insertnode->next = minnode;maxnode->next = insertnode;return head;}//2)如果介于最大和最小节点之间,则从最小节点开始遍历//直到找到第一个比insertnode大的节点cur = minnode;next = minnode->next;while(next->val<insertVal){cur = next;next = next->next;}//找到了insertnode->next = next;cur->next = insertnode;return head;
}
总结
第一次做到循环排序链表的题,爽歪歪,写起来很舒服,链表的题需要勤快画图分析,分析二十分钟,写代码十分钟。
相关文章:
【Leetcode——排序的循环链表】
😊😊😊 文章目录一、力扣题之排序循环链表二、解题思路1. 使用双指针法2、找出最大节点,最大节点的下一个节点是最小节点,由此展开讨论总结一、力扣题之排序循环链表 题目如下:航班直达!&#…...
ChatGPT研究分享:机器第一次开始理解人类世界目录
0、为什么会对ChatGPT感兴趣一开始,我对ChatGPT是没什么关注的,无非就是有更大的数据集,完成了更大规模的计算,所以能够回答更多的问题。但后来了解到几个案例,开始觉得这个事情并不简单。我先分别列举出来,…...
【linux】Linux基本指令(上)
前言: 在之前我们已经简单了介绍了一下【Linux】,包括它的概念,由来啊等进行了讲解,接下来我们就将正式的踏入对其的学习!!! 本文目录👉操作系统的概念1.命令的语法1.1命令介绍1.2选…...
程序员必会技能—— 使用日志
目录 1、为什么要使用日志 2、自定义日志打印 2.1、在程序中得到日志对象 2.2、使用日志对象打印日志 2.3、日志格式 3、日志的级别 3.1、日志级别的分类 3.2、日志级别的设置 4、持久化日志 5、更简单的日志输出——lombok 5.1、如何在已经创建好的SpringBoot项目中添加…...
生成项目的包依赖文件requirements.txt
目录生成项目的包依赖文件requirements.txtrequirements.txt文件怎么来?使用pipreqs第三方库requirements.txt文件使用requirements.txt生成项目的包依赖文件requirements.txt 在安装部署代码时或者使用别人的项目时,会需要安装项目的依赖包,…...
安卓渐变的背景框实现
安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合,这是最推荐的方法,也是最有效的。2.利用canvas裁剪实现,这个方法有个缺陷,就是圆角会出现毛边,也就是锯齿。3.利用layer绘制边框1.背景 万…...
【拳打蓝桥杯】算法前置课——时间复杂度与空间复杂度
文章目录前言为什么需要复杂度分析?大O复杂度表示法时间复杂度分析几种常见时间复杂度实例分析空间复杂度分析内容小结最后说一句🐱🐉作者简介:大家好,我是黑洞晓威,一名大二学生,希望和大家一…...
vite中动态引入图片,打包之后找不到图片地址?
一般来说项目中我们集中存放图片,然后希望在页面中直接引入! 更好的就是直接在模板中调用一个函数 然后传入图片的名字就可以显示出来 事实上确实可以办到,我们用到了一个 new URL import.meta.url这俩个东西 再src目录下 static 下创建一…...
Docker 常用命令大全
目录 一、Docker (一)Docker基础命令 (二)docker镜像命令 (三)docker容器命令 (四)docker运维命令 一、Docker 容器是一种虚拟化技术,容器是镜像实例…...
React项目规范:目录结构、根目录别名、CSS重置、路由、redux、二次封装axios
React项目(一)一、创建项目二、目录结构三、craco配置别名并安装less1.craco安装2.配置别名3.安装less四、CSS样式重置五、配置路由六、配置Redux1.创建大仓库2.创建小仓库(1)方式1:RTK(2)方式2…...
SystemVerilog 教程第一章:简介
SystemVerilog 教程像 Verilog 和 VHDL 之类的硬件描述语言 (HDL) 主要用于描述硬件行为,以便将其转换为由组合门电路和时序元件组成的数字块。为了验证 HDL 中的硬件描述正确无误,就需要具有更多功能特性的面向对象的编程语言 (OOP) 来支持复杂的测试过…...
【Java|基础篇】逻辑控制-顺序结构、分支结构和循环结构
文章目录顺序结构分支结构if单分支语句if else双分支语句if else if else多分支语句switch语句循环语句for循环while循环do while循环continuebreak总结顺序结构 顺序结构是指代码按照从上往下的顺序依次执行 分支结构 选择语句是条件成立时,才会执行的语句.共有三种.分为是if…...
【数据挖掘实战】——家用电器用户行为分析及事件识别(BP神经网络)
项目地址:Datamining_project: 数据挖掘实战项目代码 目录 一、背景和挖掘目标 1、问题背景 2、原始数据 3、挖掘目标 二、分析方法与过程 1、初步分析 2、总体流程 第一步:数据抽取 第二步:探索分析 第三步:数据的预处…...
Kmeans聚类算法-python
import random import pandas as pd import numpy as np import matplotlib.pyplot as plt # 计算欧拉距离 def calcDis(dataSet, centroids, k): clalist[] for data in dataSet: diff np.tile(data, (k, 1)) - centroids #相减 (np.tile(a,(2,1))就是把…...
Linux|奇怪的知识|locate命令---文件管理小工具
前言: Linux的命令是非常多的,有一些冷门的命令,虽然很少用,但可能会有意想不到的功能,例如,本文将要介绍的locate命令。 (平常很少会想到使用此命令,find命令使用的更多,偶然想起…...
Cadence Allegro 导出Function Pin Report报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Function Pin Reportt作用3,Function Pin Report示例4,Function Pin Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频 1,概述...
蓝桥杯2018年第九题-缩位求和
题目:在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。比如:248 * 15 3720把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是1位数,得2 4 8 14 > 1 4 5;1 5 65…...
基于Yolv5s的口罩检测
1.Yolov5算法原理和网络结构 YOLOv5按照网络深度和网络宽度的大小,可以分为YO-LOv5s、YOLOv5m、YOLOv5l、YOLOv5x。本文使用YOLOv5s,它的网络结构最为小巧,同时图像推理速度最快达0.007s。YO-LOv5的网络结构主要由四部分组成,分别…...
Linux基本命令
Linux基本命令Linux的目录结构Linux命令入门目录切换相关命令(cd/pwd)相对路径、绝对路径和特殊路径符创建目录命令(mkdir)文件操作命令part1 (touch、cat、more)文件操作命令part2 (cp、mv、rm)查找命令 (which、find…...
云原生场景下的安全左移
本博客地址:https://security.blog.csdn.net/article/details/129430859 一、安全左移概述 安全左移需要考虑开发安全、软件供应链安全、镜像仓库、配置核查这四个部分。 首先是开发安全,安全团队需要关注代码漏洞,比如使用代码检查工具进…...
从像素到对象:如何用HANet和SNUNet搞定遥感影像中的‘小目标’与‘不平衡’难题?
从像素到对象:HANet与SNUNet在遥感影像小目标检测中的实战解析 当洪水退去后的灾损评估卫星图上,那些被冲毁的农舍屋顶往往只占据几个像素;在城市违建监测中,新增的违章建筑可能只是高分辨率影像中的微小色块。这些"小目标&q…...
避坑指南:为什么你的神经网络总过拟合?Dropout层参数设置全解析
避坑指南:为什么你的神经网络总过拟合?Dropout层参数设置全解析 训练神经网络时,最令人沮丧的莫过于看到验证集准确率在某个点突然停滞不前,而训练集指标却持续攀升——典型的过拟合信号。作为从业者,我们常陷入两难&a…...
炉石传说脚本Hearthstone-Script:三步从零到精通的自动化游戏指南 [特殊字符]
炉石传说脚本Hearthstone-Script:三步从零到精通的自动化游戏指南 🎮 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com…...
【笔试真题】- 小红书-2026.03.25-第二套
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 小红书-2026.03.25-第二套 题目一:A先生的用户数据整理 把每条记录的三个字段按类型识别出来即可:带小数点的是经验值,全小写字符串是用户名,剩下的整数就…...
超好看的Win10音量控制工具Eartrumpet
链接:https://pan.quark.cn/s/48beeba09372Eartrumpe是一款非常好用的系统音量控制工具,可以针对不同的应用进行音量控制,让你同时播放多个音频,在打游戏的时候可以调小游戏声音播放音乐,有需要的朋友欢迎下载使用&…...
星露谷物语模组加载器SMAPI终极指南:轻松安装与高效管理
星露谷物语模组加载器SMAPI终极指南:轻松安装与高效管理 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI 想要让你的《星露谷物语》游戏体验焕然一新吗?SMAPI模组加载器就是你…...
前端开发必备:fnm取代nvm,Node版本管理又快又稳
几乎前端都用过node版本管理工具nvm,但可能你没听说过fnm, fnm全称是 Fast Node Manager,就是一款用来管理电脑上 Node.js 版本的工具,简单说就是帮你在不同 Node 版本之间快速切换,解决项目依赖版本冲突的问题&#x…...
像素幻梦部署实战:阿里云ECS+GPU实例零配置运行像素工坊全记录
像素幻梦部署实战:阿里云ECSGPU实例零配置运行像素工坊全记录 1. 像素幻梦创意工坊简介 像素幻梦(Pixel Dream Workshop)是一款基于FLUX.1-dev扩散模型的下一代像素艺术生成工具。它采用独特的16-bit像素工坊视觉设计,为创作者提供沉浸式的AI绘图体验。…...
【一键养龙虾】阿里云OpenClaw快速部署方案,两步拥有专属龙虾AI助理!
还在羡慕别人拥有能“动手干活”的AI数字员工吗?还在为复杂的本地环境配置、端口映射和依赖冲突而头疼吗?别急,阿里云推出了OpenClaw快速部署方案,官方镜像一键部署,只需两步,轻松拥有专属“龙虾AI”助理&a…...
新手必看:GLM-4V-9B环境配置与简单调用,附完整代码示例
新手必看:GLM-4V-9B环境配置与简单调用,附完整代码示例 1. 环境准备与快速部署 1.1 硬件要求 GPU显存:至少24GB(FP16精度)或12GB(INT4量化)推荐配置:NVIDIA RTX 4090或更高性能显…...
