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

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

















