环形链表 II python3(leetcode142)

#142. 环形链表 II

属实难到了

解决步骤:

1 判断是否有环

2 用快慢指针找到交点

3 设两个新指针分别从head和交点出发,两个新指针相等的点则是入环点

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        # 首先判断是否有环
        # 两个指针第一次相遇,头节点到环入口的位置的距离就是环的总长度减去慢指针在环内的走过的距离
        slow, fast = head, head
        while fast and fast.next: # 保证ListNode元素大于1
            slow, fast = slow.next, fast.next.next

        # 当快慢指针相遇后,p从head节点运动,q从相遇节点运动,
        # 当两者相同时,即两者都是环的初始状态时,二者相等,相等的位置也是环的初始节点
            if slow == fast:
                p = head
                q = slow
                while(p != q):
                    p, q = p.next, q.next
                return p
        
        else:
            return None   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值