[LeetCode][147]对链表进行插入排序

题目描述

给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。
提示:

列表中的节点数在 [1, 5000]范围内
-5000 <= Node.val <= 5000

普适的注意点

循环条件的书写顺序

比如 while(current->val>iNode->val && iNode) 这样的写法可能会出现问题,在判断current->val>iNode->val之前,应该先判断iNode是否为空,否则可能会导致访问空指针。

新节点的使用

在链表题中,如果要使用新节点应使用 new 创建,否则为临时变量,函数结束后节点将被销毁

本题要点

  1. 使用插入排序要明确的一个很重要的点:待排序序列分为两部分,在本轮待插入的节点前面的都是排序好的,后面都是未排序的。
  2. 插入时,需要处理的特殊情况:本轮待插入节点已经比排序好的序列都大,那么不用执行插入,更新待排序节点即可
  3. 使用假头(dummyHead)对整个链表进行统一管理,这样可以避免在排序过程中由于传入的head的位置改变而导致的错误,最后返回 dummyHead->next 即可
  4. 关于稳定性的要求:两处比较中使用了等于号都确保了稳定性
    在这里插入图片描述

本题思路

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* insertionSortList(ListNode* head) {if(!head) return nullptr;ListNode *dummyHead = new ListNode(0);dummyHead->next = head;ListNode *lastSorted = head;ListNode *current = head->next;while(current){if(current->val >= lastSorted->val){//如果当前节点比已排序节点都大lastSorted = lastSorted->next;}else{ListNode *iNode = dummyHead;while(iNode->next->val<=current->val){iNode = iNode->next;}lastSorted->next = current->next;current->next = iNode->next;iNode->next = current;}current = lastSorted->next;  }return dummyHead->next;}
};
  1. 判断链表是否为空,如果是,直接返回
  2. 使用假头管理链表
  3. 设置一个待插入节点的指针 current,用于访问待插入节点
  4. 设置待插入节点的前一个节点的指针 lastSorted,其实也就是排序完成的那部分的最后一个节点的指针,这个指针的作用:当 current 改变位置后,lastSorted 可以访问到下一个待插入的节点
  5. 一共有两个循环,对应插入排序时间复杂度为O(n^2)的特点
  6. 外层循环中,首先判断待插入节点是否比已排序节点都大(和最后一个排序完成的节点比较),如果是,更新最后一个排序完成的节点为当前节点,并利用最后一个排序完成的节点更新待插入节点即可
  7. 如果待插入节点在已排序序列中不是最大的,那么就在已排序节点中从头进行遍历,直到找到一个比待插入节点大的节点即可(此处的循环条件不用检查遍历的节点是否为空,因为第六步已经确定待插入节点比前面的已经排序完成的节点小,所以不可能遍历到链表尾,所以遍历的节点不可能为空,也就不用检查)
  8. 找到插入位置后,由于要将当前待插入节点进行插入,所以先要断开其原来的连接,也就是更新最后一个排序完成节点的下一个值:lastSorted->next = current->next,然后将待插入节点进行插入,最后使用最后一个排序完成的节点更新当前待插入的节点即可

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

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

相关文章

蓝桥杯倒计时 43天 - 前缀和

思路&#xff1a;如果用n^2复杂度暴力会超时。nlogn 可以&#xff0c;利用前缀和化简&#xff0c;提前存储某个位置前的每个石头搬运到该位置和每个石头后搬运到该位置的前缀和On最后直接输出 On。排序花 nlogn #include<bits/stdc.h> using namespace std; typedef pai…

四川尚熠电子商务有限公司电商服务领域的佼佼者

在数字化浪潮席卷全球的今天&#xff0c;电子商务已成为推动企业转型升级、拓展市场渠道的重要力量。四川尚熠电子商务有限公司&#xff0c;作为一家专注于抖音电商服务的公司&#xff0c;凭借其独特的服务模式和创新的营销策略&#xff0c;在激烈的市场竞争中脱颖而出&#xf…

JVM运行时数据区——本地方法接口和本地方法栈

1、本地方法接口 虽然Java语言使用非常广泛&#xff0c;但是有些事务Java仍然无法处理。例如线程相关的功能&#xff0c;在线程类当中就有很多本地方法接口。那么Java如何来处理这些问题呢&#xff1f;Java设计师提出了一种解决方案就是本地方法接口。本贴将会讲解本地方法接口…

vscode 引入外部依赖包

背景 我要在vscode中写一些antlr代码生成的cpp代码&#xff0c;但是在引入头文件#include "antlr4-runtime.h"的时候&#xff0c;出现报错&#xff0c;显示没有这个头文件&#xff0c;显然这是我们没有导入相关的包&#xff0c;因此我首先尝试了将antlr4的依赖源码在…

把简单留给用户,把复杂交给 AI

2024 年伊始&#xff0c;Kyligence 联合创始人兼 CEO 韩卿&#xff08;Luke&#xff09;分享了对 AI 与数据行业的一些战略思考&#xff0c;以及对中美企业服务市场的见解&#xff0c;引发业界同仁的广泛共鸣。正值 Kyligence 成立 8 周年&#xff0c;恰逢 AI 技术应用风起云涌…

SpringBoot+aop实现主从数据库的读写分离

读写分离的作用是为了缓解写库&#xff0c;也就是主库的压力&#xff0c;但一定要基于数据一致性的原则&#xff0c;就是保证主从库之间的数据一定要一致。如果一个方法涉及到写的逻辑&#xff0c;那么该方法里所有的数据库操作都要走主库。 一、环境部署 数据库&#xff1a;…

二叉搜索树在线OJ题讲解

二叉树创建字符串 我们首先进行题目的解读&#xff1a; 大概意思就是用&#xff08;&#xff09;把每个节点的值给括起来&#xff0c;然后再经过一系列的省略的来得到最后的结果 大家仔细观察题目给出的列子就可以发现&#xff0c;其实这个题目可以大致分为三种情况&#xff1…

【OpenGL编程手册05】纹理渲染

目录 一、说明二、概述三、纹理环绕方式四、纹理过滤五、多级渐远纹理六、加载与创建纹理七、生成纹理八、应用纹理九、纹理单元练习 一、说明 我们已经了解到&#xff0c;我们可以为每个顶点添加颜色来增加图形的细节&#xff0c;从而创建出有趣的图像。但是&#xff0c;如果…

文本多分类

还在用BERT做文本分类&#xff1f;分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_ernir 文本分类-CSDN博客 /usr/bin/python3 -m pip install --upgrade pip python3-c"import platform;print(platform.architecture()[0]);print(platform.machine…

Linux--Redis 群集

9.1.1 关系型数据库与非关系型数据库 数据库按照其结构可以分为关系型数据库与其他数据库&#xff0c;而这些其他数据库我们将其统称为非 关系型数据库。Redis数据库是一个非关系型数据库。 1、关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型基础上…

MATLAB练习题:排队论问题的模拟

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 下面我们来看一道排队论的题目。假设某银行工作时间内只有一个…

硬盘坏了怎么把数据弄出来?数据恢复方法推荐

在数字化时代电脑硬盘中的数据承载着我们的工作成果、生活回忆和珍贵资料。然而一旦硬盘出现故障&#xff0c;数据的安全就变得岌岌可危。那么当电脑硬盘出现问题时&#xff0c;我们真的无法挽回那些重要数据了吗&#xff1f;答案是&#xff1a;不一定&#xff01;本文将为您介…

【GPU驱动开发】- AST简介

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; AST&#xff0c;抽象语法树&#xff0c;是一种包含丰富语义信息的格式&#xff0c;其中包括类型、表达式树和符号等。 TranslationUnitDecl&#xff1a;该类表示一个输入源文件 ASTContext&…

Socket网络编程(六)——简易聊天室案例

目录 聊天室数据传输设计客户端、服务器数据交互数据传输协议服务器、多客户端模型客户端如何发送消息到另外一个客户端2个以上设备如何交互数据&#xff1f; 聊天室消息接收实现代码结构client客户端重构server服务端重构自身描述信息的构建重构TCPServer.java基于synchronize…

Android 12.0 framework关于systemUI定制之导航栏透明背景的功能实现

1.概述 在12.0的系统rom产品定制化开发中,在对于系统原生SystemUI的导航栏背景在沉浸式导航栏的 情况下默认是会随着背景颜色的变化而改变的,在一些特定背景下导航栏的背景也是会改变的,所以由于产品开发需要 要求需要设置导航栏背景为透明的,所以就需要在Activity创建的时…

第十五天-爬虫项目实战

目录 1.介绍 2.代码 1.main.py 2.PageSider.py 3.DetailSpider.py 4.DataParse.py 5.Constant.py 6.HanderRequest.py 1.介绍 1. 使用多线程爬取网站 2.爬取数据后保存至excel 3.爬取网站(仅做测试)网创类项目爬取&#xff1a;https://www.maomp.com/ 4..实现效果 …

Java已死?凛冽寒风,刺骨现实

文章首发于公众号&#xff1a;职谷智享 2024年&#xff0c;寒风凛冽&#xff0c;不仅吹进了人们的衣领&#xff0c;也吹进了程序员的心里。曾经风光无限的Java&#xff0c;如今似乎正在走向末路。 招聘需求骤减&#xff0c;求职者如过江之鲫 猎聘网的数据显示&#xff0c;20…

Linux 任务进程命令练习

1、通过ps命令的两种选项形式查看进程信息 2、通过top命令查看进程 3、通过pgrep命令查看sshd服务的进程号 4、查看系统进程树 5、使dd if/dev/zero of/root/file bs1M count8190 命令操作在前台运行 6、将第5题命令操作调入到后台并暂停 7、使dd if/dev/zero of/root/file2 bs…

Flutter中Future和Stream关系

Future和Stream类是Dart异步编程的核心。 Future 表示一个不会立即完成的计算过程。与普通函数直接返回结果不同的是异步函数返回一个将会包含结果的 Future。该 Future 会在结果准备好时通知调用者。 Stream 是一系列异步事件的序列。其类似于一个异步的 Iterable&#xff0c;…

力扣SQL50 大的国家 查询

Problem: 595. 大的国家 Code select name,population,area from World where area > 3000000 or population > 25000000;