LeetCode题练习与总结:对链表进行插入排序--147

一、题目描述

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

插入排序 算法的步骤:

  1. 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
  2. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
  3. 重复直到所有输入数据插入完为止。

下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。

对链表进行插入排序。

示例 1:

输入: head = [4,2,1,3]
输出: [1,2,3,4]

示例 2:

输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

提示:

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

二、解题思路

插入排序的基本思想是,维护一个有序的序列,将未排序的元素插入到有序序列的正确位置。对于链表来说,插入排序的时间复杂度是O(n^2),但空间复杂度是O(1),因为它只需要常数级别的额外空间。

以下是针对链表进行插入排序的步骤:

  1. 创建一个虚拟头节点 dummy,它的 next 指针指向链表的头部 head。这样做是为了方便在链表头部插入节点。
  2. 初始化两个指针,lastSorted 指向链表的最后一个已排序节点,current 指向待排序的节点,初始时 lastSorted 为 dummycurrent 为 head
  3. 遍历链表,对于每个待排序的节点 current: a. 从链表头部开始遍历已排序的节点,找到 current 应该插入的位置。 b. 将 current 从原位置摘除。 c. 将 current 插入到正确的位置。 d. 更新 lastSorted 为 current
  4. 继续步骤3,直到 current 为 null,此时链表已经排序完成。

三、具体代码

class Solution {public ListNode insertionSortList(ListNode head) {if (head == null) return null;ListNode dummy = new ListNode(0); // 创建一个虚拟头节点ListNode lastSorted = head; // 最后一个已排序的节点ListNode current = head.next; // 当前待排序的节点// 存储链表剩余部分dummy.next = head;while (current != null) {if (lastSorted.val <= current.val) {// 如果当前节点大于等于最后一个已排序的节点,直接后移lastSorted = lastSorted.next;} else {// 否则,从链表头开始找插入位置ListNode prev = dummy;while (prev.next.val <= current.val) {prev = prev.next;}// 将current节点从原位置摘除lastSorted.next = current.next;// 将current节点插入到正确的位置current.next = prev.next;prev.next = current;}// 移动current到下一个待排序的节点current = lastSorted.next;}return dummy.next; // 返回虚拟头节点的下一个节点,即排序后的链表头}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历整个链表需要O(n)的时间,其中n是链表的长度。
  • 对于链表中的每个节点,最坏的情况下可能需要遍历已经排序的部分来找到插入的位置,这也需要O(n)的时间。
  • 因此,对于每个节点,最坏的情况是O(n)的时间复杂度,总的时间复杂度是O(n^2),因为需要遍历每个节点。

在最好的情况下,即链表已经是有序的,每个节点只需要O(1)的时间来检查是否需要移动,总的时间复杂度是O(n)。

2. 空间复杂度
  • 该算法只使用了几个额外的指针(dummy, lastSorted, current, prev),不管链表有多大,这些额外的空间都是常数级别的。
  • 因此,空间复杂度是O(1),即常数空间复杂度。

综上所述,该代码的时间复杂度在最坏情况下是O(n^2),在最好情况下是O(n),空间复杂度是O(1)。

五、总结知识点

1. 链表(Linked List)

  • 链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和一个或多个指向其他节点的引用(链接)。
  • 链表的特点是动态地分配内存,不需要连续的内存空间,可以有效地插入和删除节点。

2. 虚拟头节点(Dummy Node)

  • 虚拟头节点是在链表实际头部之前添加的一个额外节点,它的值通常不重要。
  • 使用虚拟头节点可以简化链表操作,尤其是在插入和删除操作中,可以避免处理头部节点的特殊情况。

3. 插入排序(Insertion Sort)

  • 插入排序是一种简单的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
  • 插入排序的时间复杂度通常是O(n^2),但在部分有序的数据中表现较好。

4. 循环(Loop)

  • 代码中使用循环来遍历链表,这是处理链表问题时的常见做法。
  • 通过循环,可以逐个访问链表中的每个节点,并进行相应的操作。

5. 指针操作(Pointer Manipulation)

  • 在链表的操作中,频繁使用指针来改变节点之间的链接关系。
  • 代码中涉及到的指针操作包括改变节点的next引用,以实现节点的插入和删除。

6. 条件语句(Conditional Statements)

  • 代码中使用条件语句(if-else)来决定是否需要将当前节点插入到已排序部分的正确位置。

7. 变量赋值(Variable Assignment)

  • 在链表操作中,经常需要更新节点的引用,这涉及到变量的赋值操作。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element中的日期时间选择器DateTimePicker和级联选择器Cascader

简述&#xff1a;在Element UI框架中&#xff0c;Cascader&#xff08;级联选择器&#xff09;和DateTimePicker&#xff08;日期时间选择器&#xff09;是两个非常实用且常用的组件&#xff0c;它们分别用于日期选择和多层级选择&#xff0c;提供了丰富的交互体验和便捷的数据…

【server】nacos 安装

1、本地安装 1.1 nacos官网 Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网 git 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 1.2 解压并修改配置 1.2.1 通过properties 修改配置&#xff0c;添加数据库配置 1.2.2 创建数据库&…

字节码编程ASM之生成变量并sout

写在前面 本文看下如何通过asm生成变量并sout。 1&#xff1a;代码 直接看代码吧&#xff0c;注释很详细&#xff0c;有不懂的&#xff0c;留言告诉我&#xff1a; package com.dahuyuo.asmtest;import org.objectweb.asm.*; import org.objectweb.asm.commons.AdviceAdapt…

VCS+Vivado联合仿真BUG

场景&#xff1a; 在vcsvivado联合仿真过程中&#xff0c;对vivado导出的shell脚本修改&#xff0c;修改某些source文件路径&#xff0c;vcs编译时会报Permission Denied。 问题描述 对shell脚本修改如下&#xff1a; 修改仅为注释掉某一行&#xff0c;下面变为source文件新…

Linux shell编程学习笔记62: top命令 linux下的任务管理器

0 前言 top命令是Unix 和 Linux下常用的性能分析工具&#xff0c;提供了一个动态的、交互式的实时视图&#xff0c;显示系统的整体性能信息&#xff0c;以及正在运行的进程的相关信息&#xff0c;包括各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。 1 top命令…

数据特征采样在 MySQL 同步一致性校验中的实践

作者&#xff1a;vivo 互联网存储研发团队 - Shang Yongxing 本文介绍了当前DTS应用中&#xff0c;MySQL数据同步使用到的数据一致性校验工具&#xff0c;并对它的实现思路进行分享。 一、背景 在 MySQL 的使用过程中&#xff0c;经常会因为如集群拆分、数据传输、数据聚合等…

【堆 优先队列】23. 合并 K 个升序链表

本文涉及知识点 堆 优先队列 LeetCode23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#…

基流科技:超算界的新星,Pre-A轮融资大获成功

基流科技:超算界的新星,Pre-A轮融资大获成功! 在科技的浪潮中,一颗新星正在冉冉升起——基流科技,一家开放算力网络提供商,以其革命性的技术在超算界引起了轰动。今年年初,基流科技完成了 Pre-A 轮融资,由光速光合领投,此前已获得奇绩创坛、微梦传媒等知名投资方的青…

mysql定时备份数据库

文章目录 核心目标思路具体方法一、编写脚本二、修改文件属性三、找一个mysqldump文件四、把.sh放到定时器里 其它&#xff1a;windows的脚本 核心目标 解决数据库定时备份的工作。centos环境。 思路 用centos的crontab定时执行脚本。 具体方法 一、编写脚本 编写backup_…

Kafka集群部署(手把手部署图文详细版)

1.1.1 部署zookpeer 在node02下载并解压zookeeper软件包 cd /usr/local wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 或者&#xff1a;scp cat192.168.28.100:/home/cat/zookeeper-3.4.6.tar.gz /tmp&#xff08;注意目录&#xf…

鸿蒙小案例-首选项工具类

一个简单的首选项工具类 主要提供方法 初始化 init()方法建议在EntryAbility-》onWindowStageCreate 方法中使用 没多少东西&#xff0c;放一下测试代码 import { PrefUtil } from ./PrefUtil; import { promptAction } from kit.ArkUI;Entry Component struct PrefIndex {St…

计算机的错误计算(二十一)

摘要 两个不相等数相减&#xff0c;差为0&#xff1a; ? 在计算机的错误计算&#xff08;十九&#xff09;中&#xff0c;高中生小明发现本应为0的算式结果不为0. 今天他又发现对本不为0的算式&#xff0c;计算机的输出为0. 在 Python 中计算 &#xff1a; 则输出为0. 若用 C…

@react-google-maps/api实现谷歌地图嵌入React项目中,并且做到点击地图任意一处,获得它的经纬度

1.第一步要加入项目package.json中或者直接yarn install它都可以 "react-google-maps/api": "^2.19.3",2.加入项目中 import AMapLoader from amap/amap-jsapi-loader;import React, { PureComponent } from react; import { GoogleMap, LoadScript, Mar…

RabbitMQ消息可靠性等机制详解(精细版三)

目录 七 RabbitMQ的其他操作 7.1 消息的可靠性(发送可靠) 7.1.1 confim机制(保证发送可靠) 7.1.2 Return机制(保证发送可靠) 7.1.3 编写配置文件 7.1.4 开启Confirm和Return 7.2 手动Ack(保证接收可靠) 7.2.1 添加配置文件 7.2.2 手动ack 7.3 避免消息重复消费 7.3.…

JAVA:文件防重设计指南

1、简述 在现代应用程序中&#xff0c;处理文件上传是一个常见的需求。为了保证文件存储的高效性和一致性&#xff0c;避免重复存储相同的文件是一个重要的优化点。本文将介绍一种基于哈希值的文件防重设计&#xff0c;并详细列出实现步骤。 2、设计原理 文件防重的基本思路…

如何使用 3D 建模库在 C# 中将 3DS 转换为 USDZ?

USDZ/USD是一种 3D 文件格式&#xff0c;被广泛用于跨平台共享 3D 资产。另一方面&#xff0c;3DS是另一种以块形式存储数据的 3D 文件格式。在某些情况下&#xff0c;您需要将3DS 文件转换为 USDZ/USD文件格式。因此&#xff0c;本篇博文介绍了一个功能丰富的3D 建模库&#x…

6月30日功能测试Day10

3.4.4拼团购测试点 功能位置&#xff1a;营销-----拼团购 后台优惠促销列表管理可以添加拼团&#xff0c;查看拼团活动&#xff0c;启动活动&#xff0c;编辑活动&#xff0c;删除活动。 可以查看拼团活动中已下单的订单以状态 需求分析 功能和添加拼团 商品拼团活动页 3…

【Sping Boot2】笔记

Spring Boot 2入门 如何创建一个Spring Boot的Web例子&#xff1f;1.如何创建一个Spring Boot项目1.1 使用Maven构建一个Spring Boot 2项目1.1.1创建Maven工程注&#xff1a;Maven项目结构&#xff1a; 1.1.2引入SpingBoot相关依赖依赖注意事项&#xff1a; 1.1.3创建主类1.1.4…

传统数据处理系统存在的问题

传统应用的数据系统架构设计时&#xff0c;应用直接访问数据库系统。当用户访问量增加时&#xff0c;数据库无法支撑日益增长的用户请求的负载&#xff0c;从而导致数据库服务器无法及时响应用户请求&#xff0c;出现超时的错误。 出现这种情况以后&#xff0c;在系统架构上就采…

【python】OpenCV—Nighttime Low Illumination Image Enhancement

文章目录 1 背景介绍2 代码实现3 原理分析4 效果展示5 附录np.ndindexnumpy.ravelnumpy.argsortcv2.detailEnhancecv2.edgePreservingFilter 1 背景介绍 学习参考来自&#xff1a;OpenCV基础&#xff08;24&#xff09;改善夜间图像的照明 源码&#xff1a; 链接&#xff1a…