牛客-剑指offer系列题解:链表中环的入口结点

记录刷题的过程。牛客和力扣中都有相关题目,这里以牛客的题目描述为主。该系列默认采用python语言。
1、问题描述:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

2、数据结构:
链表

3、题解:
快慢指针
先判断是否有环
(如果有环,此时:假设慢指针走了L距离,则快指针走了2L的距离。假设开头到环入口的距离为s,环入口到相遇点距离为d,相遇点到环入口为h,则L = s + d,2L = s + d +h +d,联立两个方程式解得d = h)
牛客-剑指offer系列题解:链表中环的入口结点_第1张图片

所以再设置一个从头开始的指针,让其和原慢指针一起走,再次相遇点就是入口。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def EntryNodeOfLoop(self, pHead):
        # write code here
        if pHead == None:
            return None
        #快慢指针,找是否有环
        fastp = pHead
        slowp = pHead
        while fastp and fastp.next:
            fastp = fastp.next.next
            slowp = slowp.next
            if fastp == slowp:
                break
        #没环
        if fastp == None or fastp.next == None:
            return None
        #否则有环,找环入口
        slowp2 = pHead
        while slowp != slowp2:
            slowp = slowp.next
            slowp2 = slowp2.next
        return slowp

4、复杂度分析

时间复杂度:O(N)
空间复杂度:O(1)

你可能感兴趣的:(牛客-剑指offer系列题解)