leetcode 循环列表的插入(Python)

题目如果不进行思考,巨多坑。

首先我们需要找到列表中的最小值,最大值这个节点,因为找到后可以与我们的新元素进行比较厚插入。

找到最小值,最大值需要循环一遍列表,如果当前cur元素的值<nex元素的值,说明后一个节点更大,让nex = cur,继续循环,直到nex=<cur,那么就找到cur为最大值,nex为最小值。

坑1,列表为【3,3,3】,列表会无限循环,因此加一个条件nex != head

坑2,列表为【3,3,3,5,3】,错把第一个3当做列表开头,因此条件变为当前cur元素的值=<nex元素的值

接下来分情况讨论,新元素插在列表最前面,最后面还是中间呢?

class Solution:
  def insert(self, head: 'Optional[Node]', insertVal: int) -> 'Node':
    #algo: relative
    if not head:
        node = Node(insertVal)
        node.next = node
        return node
    # find first minimal
    cur = head
    while cur.val <= cur.next.val and cur.next != head:
        cur = cur.next
    tail = cur
    pre = cur.next
    new = Node(insertVal)
    if pre.val >= insertVal:
        new.next = pre
        tail.next = new
    elif tail.val <= insertVal:
        tail.next = new
        new.next = pre
    else:
        cur = pre
        while cur.next.val < insertVal:
            cur = cur.next
        nex = cur.next
        cur.next = new
        new.next = nex
    return head

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值