Problem: 2807. 在链表中插入最大公约数
解题方法
用辗转相除法求最大公约数
辗转相除法?
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。方法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。那么最后的除数就是这两个数的最大公约数。
转载文章:https://cloud.tencent.com/developer/article/1467099
算法模板:
def gcb(self, a: int, b: int) :
return self.gcb(b, a % b) if b != 0 else a
C++ 和 Python 的gcd
内置函数可以求最大公约数
复杂度
时间复杂度:
添加时间复杂度, 示例: O ( n ) O(n) O(n)
空间复杂度:
添加空间复杂度, 示例: O ( 1 ) O(1) O(1)
Code
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def gcb(self, a: int, b: int) :
return self.gcb(b, a % b) if b != 0 else a
def insertGreatestCommonDivisors(self, head: Optional[ListNode]) -> Optional[ListNode]:
last = None
cur = head
while cur:
if last:
last.next = ListNode(self.gcb(last.val, cur.val), cur)
last = cur
cur = cur.next
return head
小结
早起刷题就是爽,虽然题目蛮简单。但看着题解中没有几个解答,然后发布自己的题解还是很有成就感的