在本篇博客文章中,我们将探讨如何实现一个算法,该算法可以在链表中相邻节点之间插入一个新的节点,新节点的值为相邻两个节点值的最大公约数(GCD)。这个问题是 LeetCode 上的一个中等难度问题,涉及到链表操作和最大公约数的计算。
问题描述
解题思路
理解问题
首先,我们需要理解问题的核心:在链表的相邻节点之间插入新节点,新节点的值为相邻节点值的最大公约数。
计算最大公约数
我们需要一个函数来计算两个数的最大公约数。这可以通过欧几里得算法实现,该算法基于这样一个事实:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
链表操作
我们需要遍历链表,找到相邻的节点对,并在它们之间插入新节点。这涉及到创建新节点、更新指针等操作。
实现代码
以下是实现这个算法的 C++ 代码:
/**
* 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* curr = head;
while (curr->next!= nullptr) {
// 创建新节点存储最大公约数
ListNode* newNode = new ListNode(gcd(curr->val, curr->next->val));
// 保存下一个节点
ListNode* nextNode = curr->next;
// 插入新节点
curr->next = newNode;
newNode->next = nextNode;
// 移动到下一组节点
curr = nextNode;
}
return head;
}
};
代码解释
-
计算最大公约数:
gcd
函数使用欧几里得算法计算两个数的最大公约数。 -
在链表中插入最大公约数:
-
创建一个虚拟头节点
dummy
,简化边界情况处理。 -
遍历链表,对于每一对相邻节点,计算它们的最大公约数,并创建一个新节点。
-
将新节点插入到相邻节点之间。
-
更新
curr
指针,继续处理下一对相邻节点。
-
-
返回结果:返回插入新节点后的链表头节点。
总结
通过计算最大公约数和进行链表操作,我们可以在链表中相邻节点之间插入新节点,新节点的值为相邻节点值的最大公约数。这种方法不仅代码简洁,而且能够有效地解决问题。