题解 | #牛牛的冒险旅程#
牛牛的冒险旅程
https://www.nowcoder.com/practice/79f7bf3d985c4b33af6d048ab53848d6
主要分为三步操作:
1、判断是否存在环
2、确认环部分节点对应哪些数值并存入列表
3、求列表所有数的最大公约数
详细思路:
1、使用快慢指针
需要注意:这里环不是节点组成环,是数值组成环。实际不是环结构,数值发生重复就判定为存在环
2、基于以数值判定环,把慢指针到快指针之间节点对应值存入列表
保存数值后,移动慢指针(如果移动快指针会发生越界)
3、编写求多个数最大公约数的方法,对2中数列求最大公约数
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @return int整型
#
class Solution:
def gcd(self, val_a, val_b) -> int:
if val_a > val_b:
smaller = val_b
elif val_a < val_b:
smaller = val_a
else:
return val_a
res = 1
for i in range(1, smaller + 1):
if (val_a % i == 0) and (val_b % i == 0):
res = i
return res
def gcdOfList(self, values: List[int]) -> int:
count = len(values)
if count == 1:
return values[0]
temp_gcd = self.gcd(values[0], values[1])
for i in range(2,count):
temp_gcd = self.gcd(temp_gcd,values[i])
return temp_gcd
def gcdInCycle(self, head: ListNode) -> int:
if head is None or head.next is None:
return -1
slow_node = head
quick_node = head.next
while (quick_node is not None) and (quick_node.val != slow_node.val):
if quick_node.next is not None:
quick_node = quick_node.next.next
slow_node = slow_node.next
else:
return -1
if quick_node is None:
return -1
values = [slow_node.val]
slow_node = slow_node.next
while quick_node != slow_node:
values.append(slow_node.val)
slow_node = slow_node.next
return self.gcdOfList(values)

