本文主要是介绍力扣2807.在链表中插入最大公约数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
思路:遍历链表,对于每一个结点求出它与下一个结点的最大公约数并插入到俩个结点之间
代码:
/*** 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;}
};
这篇关于力扣2807.在链表中插入最大公约数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!