给你一个链表的头 head ,每个结点包含一个整数值。
在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。
请你返回插入之后的链表。
两个数的 最大公约数 是可以被两个数字整除的最大正整数。
示例 1:
提示:
链表中结点数目在 [1, 5000] 之间。
1 <= Node.val <= 1000
直接模拟即可:
/*** 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) {if (head == nullptr){return nullptr;}ListNode *curNode = head;while (curNode->next){int gcd = getGCD(curNode->val, curNode->next->val);curNode->next = new ListNode(gcd, curNode->next);curNode = curNode->next->next;}return head;}private:int getGCD(int i, int j){int k = 0;do{k = i % j;i = j;j = k;} while (k != 0);return i;}
};
如果链表中有n个节点,此算法时间复杂度为O(n),空间复杂度为O(1)。
求公约数时,可直接使用C++标准库中的__gcd函数,它所在的头文件是algorithm:
/*** 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) {if (head == nullptr){return nullptr;}ListNode *curNode = head;while (curNode->next){int gcd = __gcd(curNode->val, curNode->next->val);curNode->next = new ListNode(gcd, curNode->next);curNode = curNode->next->next;}return head;}
};