剑指offer第二版(Python3)--面试题23:链表中环的入口

第2章 面试需要的基础知识

第3章 高质量的代码

  面试题16:数值的整数次方

  面试题21:调整数组顺序使奇数位于偶数前面

  面试题22:链表中倒数第k个结点

  面试题23 :链表中环的入口

  面试题24 :翻转链表

第4章 解决面试题的思路

第5章 优化时间和空间效率

第6章 面试中的各项能力

第7章 两个面试案例


题目描述
牛客网
  给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

解题思路
剑指offer第二版(Python3)--面试题23:链表中环的入口_第1张图片
AC = k
CB = n
CC = m 环周长

  快指针每次走两步,慢指针每次走一步。
  B点相遇时,慢指针走了 k+n,快指针走了 k+n+mx,x表示在环中走了x圈。
则有
             2(k+n) = k+n+mx
得到
                k = mx-n
  从上式可以看出,若此时一个指针从B点出发,一个指针从A点出发,以相同的速度前进,则必在C点相遇。还不懂的话继续看,若有k=mx,则一个指针从C出发,一个指针从A出发,以相同速度前景,则必在C相遇,这是显然的,但是前面推出k=mx-n,所以我们可以让那个从C点出发的指针先走n步,然后在一起出发,不就仍在C点相遇吗。先走n步不就是到了B点吗,相当于在B点出发咯。

实战

class Solution:
    def EntryNodeOfLoop(self, pHead):
        # write code here
        if not pHead:
            return None
        fast, slow = pHead, pHead
        while fast:
            if not fast.next or not fast.next.next:
                return None
            fast = fast.next.next
            slow = slow.next
            if fast == slow:
                break
        fast = pHead
        while fast:
            if fast == slow:
                return fast
            fast = fast.next
            slow = slow.next
        return None

你可能感兴趣的:(算法设计,剑指offer,链表中环的入口,Python3)