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

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

力扣2807.在链表中插入最大公约数_第1张图片

代码: 

/**
 * 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;
    }
};

你可能感兴趣的:(力扣刷题笔记,leetcode,链表,算法,学习,笔记,c++)