Leetcode2807. 在链表中插入最大公约数

文章讲述了如何在链表中插入新节点,其值为前两个节点的最大公约数。使用欧几里得算法计算,同时提到应注意输入范围、负数处理和递归可能导致的栈溢出问题。
摘要由CSDN通过智能技术生成

Problem: 2807. 在链表中插入最大公约数

题目思路

模拟插入流程:

  1. 检测当前节点是否有后置结点;
  2. 将当前结点与后置结点的值做最大公约数处理得到新结点的值,然后插入到当前结点之后;
  3. 再将检测结点向后移动两个位置;
  4. 循环123即可;

注意点

计算最大公约数其实有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);
        }
    }

这段代码是一个计算两个整数最大公约数的函数,使用了欧几里得算法。

  • 函数的参数是两个整数 ab。如果 b 是0,那么返回 a,因为任何数和0的最大公约数都是它自己。如果 b 不是0,那么递归地调用 GreatestCommonDivisors(b, a % b)
  • 这个函数使用了欧几里得算法的思想,递归地计算最大公约数。算法的基本思想是:gcd(a,b)=gcd(b,amod b)。这个过程会持续到b等于0,此时a就是最大公约数。
  • 需要注意的是,因为题目的val范围设计在1-1000,所以这个函数没有处理负数的情况,如果输入的 ab 是负数,可能会导致不正确的结果。另外,如果函数被频繁调用,可能会导致栈溢出,因为这是一个递归函数。

Code

/**
 * 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;
    }
};
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰不停前进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值