1. 程式人生 > >連結串列環的入口節點

連結串列環的入口節點

題目描述 給一個連結串列,若其中包含環,請找出該連結串列的環的入口結點,否則,輸出null。 思路: 如圖.1所示,先讓指標p1先走,然後指標p2走,其中,p1,p2的步伐分別是1和2,那麼p2相對於p1每次都走快一步,所有如果有環,則一定有p1=p2的時候,假設在A點相遇,則p1走過的路程x,與p2走過的路程滿足如下關係:

(1)2x=x+an 其中,n代表環中節點的個數,a代表走了幾次完整的環,即p2p1多走的路徑,實際上,由公式(1)知x=an,無論a取值多少,相遇點都在A,即可以看成
n=1
,那麼p1走了長度為n,那麼此時讓一個指標p在初始點Op1同時並且步長為1走的話,那麼相遇點一定在環的入口點,因為對指標p1來說,它走了n+|OB|的步數,而指標p走了|OB|的步數。

這裡寫圖片描述

圖.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 p1,p2=pHead,pHead while True: p1=p1.next if p2.next==None: return None p2=p2.next.next if p1==None or p2==None: return None if
p1==p2: break p2=pHead if p1==p2: return p1 while True: p1=p1.next p2=p2.next if p1==p2: return p1