# coding: utf-8"""
判断是否相交求交点,判断是否有环,求环点,都可以利用hashset的方法,
"""from __future__ import print_function
classLinkNode:def__init__(self, val):
self.val = val
self.next=None
val_list =[5,4,9,1,0,4]
node_list =[LinkNode(_)for _ in val_list]for i inrange(1,len(node_list)):
node_list[i-1].next= node_list[i]deftraverse(head):if head isNone:print()returnprint(head.val, end=',')
traverse(head.next)
traverse(node_list[0])#判断是否有环,快慢指针defhas_cycle(head):"""
判断链表是否有环,通过快慢指针
"""
slow = head
fast = head
while slow and fast:
slow = slow.next
fast = fast.nextif fast isNone:# 相当于两条平行线,没有交点returnFalse# fast 在走一步
fast = fast.nextif fast === slow:returnTruereturnFalsedefget_cycle_node(head):"""
两个指针的交点到环点的距离与头结点到交点的距离相等
"""
p = head
q = head
meet =Nonewhile p and q:
p = p.next
q = q.nextif q isNone:returnNone
q = q.nextif p == q:
meet = q
breakif meet isNone:returnNone# 从头结点和meet结点同时出发while meet and head:if meet == head:return meet
else:
meet == meet.next
head = head.nextreturnNone