力扣2807.在链表中插入最大公约数

发布时间:2024年01月07日

思路:遍历链表,对于每一个结点求出它与下一个结点的最大公约数并插入到俩个结点之间

代码:?

/**
 * 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:
    ListNode* insertGreatestCommonDivisors(ListNode* head) {
        ListNode *p = head; //定义一个指针遍历链表                          

        while(p->next){
            int a = p->val, b = p->next->val, r = 1;    //取出当前结点和下一个结点的值
            while(r){   //辗转相除求最大公约数
                r = a % b;
                a = b;
                b = r;
            }

            p->next = new ListNode(a,p->next);  //插入新结点,值为最大公约数,next为p的next
            p = p->next->next;  //p往后移俩个结点,因为插入了一个结点
        }
        
        return head;
    }
};

?

__gcd(x,y)函数,用于求x,y的最大公约数

优化后代码:

/**
 * 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:
    ListNode* insertGreatestCommonDivisors(ListNode* head) {
        ListNode *p = head;               

        while(p->next){
            p->next = new ListNode(__gcd(p->val, p->next->val), p->next);   //直接用__gcd函数求最大公约数
            p = p->next->next;
        }
        
        return head;
    }
};

文章来源:https://blog.csdn.net/m0_71386740/article/details/135433238
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。