题解 | #牛牛的冒险旅程#

牛牛的冒险旅程

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)


全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务