python JZ23 链表中环的入口结点(剑指offer)

题目要求:

在这里插入图片描述

思路:

思路1:使用列表进行状态检测
思路2:快慢指针

代码如下:

思路1代码:

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def EntryNodeOfLoop(self, pHead):
        node_list = []
        while pHead:
            node_list.append(pHead)
            if node_list.count(pHead)==2: #当检测到pHead二次出现在列表时说明进入第二次循环,此时pHead即为入口节点
                return pHead
            pHead = pHead.next
        return pHead
        # write code here

思路2代码:
思路:#通过定义slow和fast指针,slow每走一步,fast走两步,若是是有环,则一定会在环的某个结点处相遇(slow==fast),设从头到入口距离为A,入口到相遇点距离为B,相遇点再到入口长为C,可以得出slow走了A+B,fast走了A+2B+C,因为fast是slow的2倍,所以2A+2B=A+2B=C,故A的距离等于C的距离,因此当快慢指针相遇后,将快指针从头开始以slow相同速度移动,slow与fast将相遇在入口节点。
在这里插入图片描述
代码:

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def EntryNodeOfLoop(self, pHead):
        fast = slow = pHead
        while fast!=None and fast.next!=None: #fast指针走的快步,若无闭环则先遇到None,且每次走两布,因次需要看当前是否为None和下一步是否为None
            fast = fast.next.next
            slow = slow.next
            if fast==slow:
                break
        if fast==None or fast.next==None: #此时有两种状态,没有环退出或相遇退出,若没有环退出返回None即可
            return None
        fast = pHead #有环就将fast指向头,和slow走相同距离后相遇出口点
        while fast!=slow: 
            fast = fast.next
            slow = slow.next
        return fast
        # write code here
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值