【LeetCode】剑指 Offer II 029. 排序的循环链表

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

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

二、思路分析:

我们读取本题,题目是一个关于循环链表中插入一个节点,使着循环列表保持非递减顺序。在解答本题之前,我们还需要研读题目内容,搞清楚如下几点信息

  • 链接是循环链表:尾部指针始终指向头部位置
  • 链表中节点数据顺序:循环单调非递减。相邻的节点相等或者递增关系
  • 循环列表为空时,则直接返回新的节点

在循环链表中,可以定义任意一个节点为头节点,而对于普通链表则不能随意指定,如图所示:

image.png

我们根据题目示列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 之间添加新节点 image.png

根据上述推理图所示,我们使用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提交记录如下:

image.png

  • 复杂度: O(n),链表的长度
  • 复杂度: O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~

猜你喜欢

转载自juejin.im/post/7110579092130856991