Leetcode 剑指 Offer II 029. 排序的循环链表

news/2024/11/25 19:12:00/

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素  insertVal ,使这个列表仍然是循环升序的。

给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。

如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。

如果列表为空(给定的节点是 null),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。

示例 1:

  • 输入:head = [3,4,1], insertVal = 2
  • 输出:[3,4,1,2]
  • 解释:在上图中,有一个包含三个元素的循环有序列表,你获得值为 3 的节点的指针,我们需要向表中插入元素 2 。新插入的节点应该在 1 和 3 之间,插入之后,整个列表如上图所示,最后返回节点 3 。

示例 2:

  • 输入:head = [], insertVal = 1
  • 输出:[1]
  • 解释:列表为空(给定的节点是 null),创建一个循环有序列表并返回这个节点。

示例 3:

  • 输入:head = [1], insertVal = 0
  • 输出:[1,0]

提示:

  • 0 <= Number of Nodes <= 5 * 10^4
  • -10^6 <= Node.val <= 10^6
  • -10^6 <= insertVal <= 10^6

题目思考

  1. 新元素有哪些可能的情况?

解决方案

思路

  • 分析题目, 待插入的新元素有以下几种情况:
    1. 原链表为空, 则插入新节点并指向自身
    2. 新元素的大小介于原链表某两个节点之间, 则插入到这两个节点之间
    3. 新元素的大小比原链表的最大节点还要大, 或者比最小节点还要小, 则插入到原链表最后一个最大节点之后
  • 综上所述, 我们先判断原始链表是否为空, 是的话处理情况 1
  • 否则的话遍历链表节点, 并额外维护一个指针, 指向最后一个最大节点
  • 如果遍历到某个节点后满足了情况 2, 则直接插入新节点, 并返回原来给定的节点
  • 如果遍历完了所有节点仍未返回, 则说明是情况 3, 将新节点插入到最后一个最大节点之后, 并返回原来给定的节点
  • 下面代码有详细的注释, 方便大家理解

复杂度

  • 时间复杂度 O(N): 只需要遍历每个节点一次
  • 空间复杂度 O(1): 只使用了几个常数空间的变量

代码

class Solution:def insert(self, head: "Node", insertVal: int) -> "Node":if not head:# 情况1: 原始链表为空, 新建指向自身的节点并返回head = Node(insertVal)head.next = headreturn head# 维护当前节点和最后最大节点cur = headmx = headwhile True:if cur.val <= insertVal <= cur.next.val:# 情况2: 找到插入位置了, 直接插入~cur.next = Node(insertVal, cur.next)return headif cur.val >= mx.val:# 更新最大节点, 特别注意需要插入到最后一个最大值之后 (例如1,2,3,3插入4, 如果存的是第一个3, 则错误插入成1,2,3,4,3)# 所以更新时相等也要更新最大值, 保证mx指向最后一个最大节点!!!mx = curcur = cur.nextif cur == head:# 所有节点都遍历过了, 退出循环break# 情况3: 此时说明插入数字要么大于所有, 要么小于所有, 统一插入到最后一个最大节点之后~mx.next = Node(insertVal, mx.next)return head

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我


http://www.ppmy.cn/news/190195.html

相关文章

[图表]pyecharts-3D柱状图

[图表]pyecharts-3D柱状图 先来看代码&#xff1a; import randomfrom pyecharts import options as opts from pyecharts.charts import Bar3D from pyecharts.faker import Fakerdata [(i, j, random.randint(0, 12)) for i in range(6) for j in range(24)] c (Bar3D().…

电脑触摸屏无法使用、失灵解决办法

以我的笔记本电脑为例&#xff0c;出现了触摸板无法使用的情况&#xff0c;解决办法&#xff1a; 打开电脑设置&#xff0c;找到触摸板&#xff0c;如下图所示&#xff0c;看是否关闭 如果这里打开了&#xff0c;仍然发现无法使用触摸屏&#xff0c;尝试按下电脑的F9键&#x…

小红书账号矩阵优化软件

小红书账号矩阵优化软件 大家有关注过品牌在⼩红书上的打法有哪些吗&#xff1f; #品牌营销#小红书运营#爆文拆解#品牌投放#爆品打造 我们如果确定了我们要去做小红书&#xff0c;那我到底该怎么去做&#xff1f;现在小红书对我们目前这些品牌来说&#xff0c;你们是作为把它…

台电TBOOK16PRO安装凤凰安卓系统

1.准备优盘&#xff0c;ventoy制作启动盘&#xff08;支持多个iso&#xff09;&#xff0c;拷贝凤凰等iso ventoy-1.0.52-windows.zip&#xff0c;解压&#xff0c;运行Ventoy2Disk.exe&#xff0c;制作启动盘&#xff0c;建2个分区&#xff0c;默认启动分区为2 建立目录iso&a…

@TBook10s 双系统删除以及新系统安装

2016年买了Tbook10 双系统&#xff0c;感觉挺好。但是用着用着&#xff0c;一方面感觉到这个本本的笨重&#xff0c;一方面系统感觉不好用。于是有了删除双系统&#xff0c;换成新系统的想法。今天终于成功换成win7.但是出问题了。开机即出现顶部红条。麻烦了。查了资料发现是w…

acpi error解决方法

非原创&#xff0c;忘了在哪看到的了&#xff0c;记录下来&#xff0c;方便以后重装系统时使用 当我们在为有独立显卡gpu的电脑安装Ubuntu系统时&#xff0c;有可能会遇到上述的问题。 解决方法一&#xff1a;先把显示器接到集成显卡上&#xff0c;装完系统后&#xff0c;再接…

使用Scrapy框架-爬取某图书网站

爬取某图书网中的教材信息&#xff08;书名、链接、作者、出版社、图片路径等&#xff09; ra.py import scrapy from readdang.items import ReaddangItemclass RdSpider(scrapy.Spider):name rdallowed_domains [category.dangdang.com]start_urls [http://category.dan…