剑指 Offer II 029. 排序的循环链表
创始人
2025-05-30 01:22:10
0

题目链接

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

题目描述

给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 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<=NumberofNodes<=5∗1040 <= Number of Nodes <= 5 * 10^40<=NumberofNodes<=5∗104
  • −106<=Node.val<=106-10^6 <= Node.val <= 10^6−106<=Node.val<=106
  • −106<=insertVal<=106- 10^6 <= insertVal <= 10^6−106<=insertVal<=106

解法:分类讨论

第一种情况:head为空,这时需要新建一个结点指向自己。

在这里插入图片描述
第二种情况:存在 insertVal >= cur.val and insertVal <= cur.next.valinsertVal 就直接插入到 curcur.next之间。

在这里插入图片描述
第三种情况:insertVal >= 链表中结点的最大值或者 insertVal <= 链表中结点的最小值,那么insertVal 就插入链表中最大结点和最小结点之间。

在这里插入图片描述

第四种情况:原链表中所有结点值都相同。此时insertVal 插入任何一个位置都可以。cur最初指向 head,如果它再次来到了 head,说明链表中的结点都一样。

在这里插入图片描述

时间复杂度: O(n)O(n)O(n) nnn 是链表中的结点数量

C++代码:

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node() {}Node(int _val) {val = _val;next = NULL;}Node(int _val, Node* _next) {val = _val;next = _next;}
};
*/class Solution {
public:Node* insert(Node* head, int insertVal) {//第一种情况 head 为空if(head == nullptr){Node * node = new Node(insertVal);node->next = node;return node;}Node * cur = head;//如果cur 再次来到head 说明链表中结点值都相同 即第四种情况while(cur->next != head){//第二种情况if(insertVal >= cur->val && insertVal <= cur->next->val) break;//第三种情况if(cur->val > cur->next->val && (insertVal >= cur->val || insertVal <= cur->next->val)) break;cur = cur->next;}//统一插入新节点 insertValNode * node = new Node(insertVal);node->next = cur->next;cur->next = node;return head;}
};

Python代码:

"""
# Definition for a Node.
class Node:def __init__(self, val=None, next=None):self.val = valself.next = next
"""class Solution:def insert(self, head: 'Node', insertVal: int) -> 'Node':if head == None:node =  Node(insertVal)node.next = nodereturn nodecur = headwhile cur.next != head:if insertVal >= cur.val and insertVal <= cur.next.val:breakif cur.val > cur.next.val and (insertVal >= cur.val or insertVal <= cur.next.val):breakcur = cur.nextnode =  Node(insertVal)node.next = cur.nextcur.next = nodereturn head

相关内容

热门资讯

防雷设计、防雷检测为什么选同为... 随着现代科技的不断发展,电子设备得到广泛应用,而雷电等自然灾害也越来越频...
最新或2023(历届)快乐的下...  今天下午,我去了隋唐遗址。那里好美丽;有小河;有草地,小河里有鱼,有虾。  我先说河,有的河水清澈...
最新或2023(历届)6年级数...  篇一  今天,妈妈给我出了一道题,题目是这样的:“一头牛可换6头猪,2头猪可换10只羊,三只羊可换...
本次小升初直升考试试卷分析这就... 还记得前几天预告的小升初直升考试吗?这次的考试对于小学六年级的孩子们来说,是非常重要的。家长朋友们也...
西安小升初528预录来了! 西... 相信大家这几天除了被各种各样的学校参观弄得有点晕,到底这参观是几个意思呢!是有暗示还是没暗示,其实这...
最新或2023(历届)认真积极...   今天妈妈带我去学英语,上课我认真听盘,积极的举手回答问题,下课后妈妈表扬了我,我很高兴。回到家我...
【js】多分支语句练习(2) 个人名片: 😊作者简介:一名大一在校生,w...
Git 的 Cherry-Pi... 1、什么是 Cherry-Pickcherry-pick 是 Git 版本控制工具中的一个命令&#x...
最新或2023(历届)观察日记...  1.  7月23日星期一  今天我从东北回来了,我迫不急待的去看我出发前种下的含羞草种子,都十天了...
多线程进阶学习01------... 开篇:为什么学习多线程 实事求是地讲,对于绝大多数研发人员,...
最新或2023(历届)观察日记...  1.  有一天,我和好朋友们到小河边捉鱼摸虾。忽然发现,阴天的时候小鱼都跳到半空中。这是为什么呢?...
最新或2023(历届)小学数学...   1.  果园里的苹果树是梨树的3倍,老王师傅每天给50棵苹果树20棵梨树施肥,几天后,梨树全部施...
最新或2023(历届)4年级数...  1.  今天上午,我按照爸爸让我写的“假期计划”,开始了复习数学、练习数学、加强数学的“启动仪式”...
最新或2023(历届)观察日记... 小绿豆  9月20日 星期三 晴  今天,老师让我们观察植物的生长过程,我选的是绿豆.我拿了十几粒绿...
最新或2023(历届)寒假日记...  篇一  前天下雪了。 鹅毛大雪飞啊飞啊,我看着窗外的景色,顿时感到好兴奋——“我又可以玩雪了!”我...
最新或2023(历届)教师节日... 1.  教师节就是今天,我非常想对老师说:"祝您节日快乐。”,我也想在您的窗前栽一株紫丁香,让它的香...
rustdesk-server... 1、rustdesk-server的中继服务器是什么原理? RustDesk是一个开源...
最新或2023(历届)日记20...  篇一  “妈妈!快看我的计划表!”妈妈走过来,说:“不错,不过要开始才行。”  我看着计划表心想:...
最新或2023(历届)200字...  1.  今天是母亲节,是为了感谢母亲的伟大、无私和辛苦而设立的节日。所以,我们这些妈妈的宝贝们,应...
最新或2023(历届)观察日记... 1.  9月29日星期六晴  我来到院子观察蚂蚁,蚂蚁们一个个长着圆圆的脑袋,挺着一个大肚子,长长的...