hash表方法
class Solution:
def EntryNodeOfLoop(self, pHead):
#创建hash表存储访问过的结点
nodes=set()
#判断有无成环结点
while pHead:
if pHead in nodes:
#查到了,就返回这个节点
return pHead
else:
#没查到,把节点加进hash表里头,并且后移一位
nodes.add(pHead)
pHead=pHead.next
#遍历完了也没有,返回没有查到
return None
双指针方法
class Solution:
def EntryNodeOfLoop(self, pHead):
fast, slow = pHead, pHead
#只要快指针没有走到链表末端,就继续尝试
while fast and fast.next:
#快指针一下走两步,慢指针一下走一步,如果有环,它俩一定会在环内某处相遇
fast = fast.next.next
slow = slow.next
# 第一次相遇
if fast and fast == slow:
# 让fast指针从出发点重新开始
fast = pHead
# 第二次相遇
while fast != slow:
#快慢指针都是每次走一步
fast = fast.next
slow = slow.next
return fast
return None