Every day a Leetcode
题目来源:2807. 在链表中插入最大公约数
解法1:2807. 在链表中插入最大公约数
遍历链表,在当前节点 cur 后面插入 gcdNode 节点,同时 gcdNode 节点指向 cur 的下一个节点。
插入后,cur 更新为 cur.next.next,也就是 cur 原来的下一个节点,开始下一轮循环。
循环直到 cur 没有下一个节点为止。
代码:
/*
* @lc app=leetcode.cn id=2807 lang=cpp
*
* [2807] 在链表中插入最大公约数
*/
// @lc code=start
/**
* 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;
for (ListNode *cur = head; cur->next != nullptr; cur = cur->next->next)
{
ListNode *gcdNode = new ListNode(gcd(cur->val, cur->next->val));
gcdNode->next = cur->next;
cur->next = gcdNode;
}
return head;
}
// 辅函数 - 求 x 和 y 的最大公约数
int gcd(int x, int y)
{
if (y == 0)
return x;
return gcd(y, x % y);
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(nlogU),其中 n 为链表长度,U 为节点值的最大值。每次计算 gcd 需要 O(logU) 的时间。
空间复杂度:O(1)。