Skip to content

Commit 6498944

Browse files
committed
add: 在链表中插入最大公约数
1 parent 6b6f3ef commit 6498944

5 files changed

+71
-1
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,10 @@ C++标准库提供的数据结构实在是太多了,参考[C++标准库头文
549549

550550
### 链表
551551

552+
- [在链表中插入最大公约数](src/list/insert_greatest_common_divisors_in_linked_list.cpp) [链表, 数学, 数论]
553+
554+
- LeetCode 2807. 在链表中插入最大公约数 <https://leetcode.cn/problems/insert-greatest-common-divisors-in-linked-list>
555+
552556
- [从链表中删去总和值为零的连续节点](src/list/remove_zero_sum_consecutive_nodes_from_linked_list.cpp) [哈希表, 链表]
553557

554558
- LeetCode 1171. 从链表中删去总和值为零的连续节点 <https://leetcode.cn/problems/remove-zero-sum-consecutive-nodes-from-linked-list>
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// 在链表中插入最大公约数
2+
// https://leetcode.cn/problems/insert-greatest-common-divisors-in-linked-list
3+
// INLINE ../../images/list/insert_greatest_common_divisors_in_linked_list.jpeg
4+
5+
#include <headers.hpp>
6+
7+
/**
8+
* Definition for singly-linked list.
9+
* struct ListNode {
10+
* int val;
11+
* ListNode *next;
12+
* ListNode() : val(0), next(nullptr) {}
13+
* ListNode(int x) : val(x), next(nullptr) {}
14+
* ListNode(int x, ListNode *next) : val(x), next(next) {}
15+
* };
16+
*/
17+
class Solution {
18+
public:
19+
ListNode *insertGreatestCommonDivisors(ListNode *head) {
20+
for (auto cur = head; cur->next; cur = cur->next->next) {
21+
cur->next = new ListNode(gcd(cur->val, cur->next->val), cur->next);
22+
}
23+
return head;
24+
}
25+
};

test/lib/lib_test.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// 执行编译时间:2024-01-05 14:42:19
1+
// 执行编译时间:2024-01-06 17:10:44
22
#include <gtest/gtest.h>
33
#include <lib.hpp>
44

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include <list/insert_greatest_common_divisors_in_linked_list.cpp>
2+
3+
TEST(在链表中插入最大公约数, ListNode) {
4+
Solution solution;
5+
// 示例 1:
6+
// 输入:head = [18,6,10,3]
7+
// 输出:[18,6,6,2,10,1,3]
8+
// 解释:第一幅图是一开始的链表,第二幅图是插入新结点后的图(蓝色结点为新插入结点)。
9+
// - 18 和 6 的最大公约数为 6 ,插入第一和第二个结点之间。
10+
// - 6 和 10 的最大公约数为 2 ,插入第二和第三个结点之间。
11+
// - 10 和 3 的最大公约数为 1 ,插入第三和第四个结点之间。
12+
// 所有相邻结点之间都插入完毕,返回链表。
13+
int list[] = {18, 6, 10, 3};
14+
int n = sizeof(list) / sizeof(int);
15+
ListNode *head = createLinkedList(list, n);
16+
ListNode *result = solution.insertGreatestCommonDivisors(head);
17+
int expected[] = {18, 6, 6, 2, 10, 1, 3};
18+
int m = sizeof(expected) / sizeof(int);
19+
ListNode *expected_result = createLinkedList(expected, m);
20+
EXPECT_STREQ(listNodeToString(head).c_str(),
21+
listNodeToString(expected_result).c_str());
22+
deleteLinkedList(head);
23+
deleteLinkedList(expected_result);
24+
25+
// 示例 2:
26+
// 输入:head = [7]
27+
// 输出:[7]
28+
// 解释:第一幅图是一开始的链表,第二幅图是插入新结点后的图(蓝色结点为新插入结点)。
29+
// 没有相邻结点,所以返回初始链表。
30+
int list2[] = {7};
31+
int n2 = sizeof(list2) / sizeof(int);
32+
ListNode *head2 = createLinkedList(list2, n2);
33+
ListNode *result2 = solution.insertGreatestCommonDivisors(head2);
34+
int expected2[] = {7};
35+
int m2 = sizeof(expected2) / sizeof(int);
36+
ListNode *expected_result2 = createLinkedList(expected2, m2);
37+
EXPECT_STREQ(listNodeToString(head2).c_str(),
38+
listNodeToString(expected_result2).c_str());
39+
deleteLinkedList(head2);
40+
deleteLinkedList(expected_result2);
41+
}

0 commit comments

Comments
 (0)