Problem: 2807. 在链表中插入最大公约数
模拟插入流程:
计算最大公约数其实有C++自带的__gcd()来实现,不过为了巩固知识也可以选择手写
同时本题的val值在1到1000之间,所以可以这样写一个计算两个整数最大公约数的函数。
int GreatestCommonDivisors(int a, int b) // 1000>=val>=1
{
if (b == 0) {
return a;
} else {
return GreatestCommonDivisors(b, a % b);
}
}
这段代码是一个计算两个整数最大公约数的函数,使用了欧几里得算法。
a
和 b
。如果 b
是0,那么返回 a
,因为任何数和0的最大公约数都是它自己。如果 b
不是0,那么递归地调用 GreatestCommonDivisors(b, a % b)
。a
和 b
是负数,可能会导致不正确的结果。另外,如果函数被频繁调用,可能会导致栈溢出,因为这是一个递归函数。/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
int GreatestCommonDivisors(int a, int b) // 1000>=val>=1
{
if (b == 0) {
return a;
} else {
return GreatestCommonDivisors(b, a % b);
}
}
ListNode* insertGreatestCommonDivisors(ListNode* head) {
ListNode* node = head;
while (node->next) {
node->next = new ListNode(
GreatestCommonDivisors(node->val, node->next->val), node->next);
node = node->next->next;
}
return head;
}
};