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

代码:

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