剑指offer-python

链表中环的入口结点

2018-08-29  本文已影响0人  fighting_css

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

思路:
a、第一步,找环中相汇点。分别用fast,slow指向链表头部,slow每次走一步,fast每次走二步,直到fast==slow找到在环中的相汇点。

b、第二步,找环的入口。接上步,当fast==slow时,fast所经过节点数为2x,slow所经过节点数为x,设环中有n个节点,fast比slow多走r圈有2x=rn+x; x=rn;(r为圈数,n为一圈的结点数)

可以看出slow实际走了多个环的步数,再让fast指向链表头部,slow位置不变。

假设链表开头到环接口的距离是y,那么x-y表示slow指针走过的除链表开头y在环中走过的距离,那么slow再走y步,此时fast结点与slow结点相遇,fast == slow ,x-y+y=x = rn,即此时slow指向环的入口。
代码:

#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def EntryNodeOfLoop(self, pHead):
        # write code here
        slow = pHead
        fast = pHead
        while fast!=None and fast.next!=None:
            fast = fast.next.next
            slow = slow.next
            #第一次相遇
            if fast==slow:
                fast = pHead
                #第二次相遇
                while fast!=slow:
                    fast = fast.next
                    slow = slow.next
                return fast
上一篇 下一篇

猜你喜欢

热点阅读