【LeetCode】剑指 Offer II 029. 排序的循环链表
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 0 <= Number of Nodes <= 5 * 10^4
- 10^6 <= Node.val <= 10^6
- 10^6 <= insertVal <= 10^6
二、思路分析:
我们读取本题,题目是一个关于循环链表中插入一个节点,使着循环列表保持非递减顺序。在解答本题之前,我们还需要研读题目内容,搞清楚如下几点信息
- 链接是循环链表:尾部指针始终指向头部位置
- 链表中节点数据顺序:循环单调非递减。相邻的节点相等或者递增关系
- 循环列表为空时,则直接返回新的节点
在循环链表中,可以定义任意一个节点为头节点,而对于普通链表则不能随意指定,如图所示:
我们根据题目示列1,来看看循环链表中创建过程和添加节点情况:
- 初始化时空链表,节点node.val = null,node.next = node
- 添加一个节点,Head.val = 3,Head.next 为null时会指向 Head本身
- 添加的新节点值大于Head.val或者小于Head.val,同时Head.next == Head 则直接在Head.next上加入新节点
- 添加的新节点newnode.val 大于等于 ptr.val 并且 newnode.val 小于等于 ptr.next.val时,则直接在ptr.next上添加newnode节点
- 添加到新节点newnode是最大值或者最小值,则在ptr.next 大于 ptr.next.val 之间添加新节点
根据上述推理图所示,我们使用python实现代码如下:
class Solution(object):
def insert(self, head, insertVal):
if head is None:
newnode = Node(insertVal)
newnode.next = newnode
return newnode
ptr = head
while ptr.next != head:
if ptr.val <= insertVal <= ptr.next.val:
break
if ptr.val > ptr.next.val and (ptr.val <= insertVal or insertVal <= ptr.next.val ):
break
ptr = ptr.next
ptr.next = Node(insertVal,ptr.next)
return head
三、总结:
本题考察循环链表添加节点,只需要找到添加当前的位置,其next就是添加新节点的位置,AC提交记录如下:
- 复杂度: O(n),链表的长度
- 复杂度: O(1)
以上是本期内容,欢迎大佬们点赞评论,下期见~~~
转载自:https://juejin.cn/post/7110579092130856991