环形链表检测
题目描述
给定一个链表的头节点 head,返回链表开始入环的第一个节点。如果链表无环,则返回 null。
为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。注意不允许修改链表。

解题思路
在之前的讲解中,我们讨论过 C 语言的快慢指针法,但考虑到代码的简洁性和可读性,这里我们直接使用 C++ STL 实现。核心逻辑是利用 std::set 遍历链表:如果当前节点不在集合中,就插入;如果在集合中,说明遇到了重复节点,即存在环,该节点即为环入口点。
代码实现
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
std::set<ListNode*> s;
ListNode* cur = head;
while(cur) {
auto it = s.find(cur); // 查找 cur 是否在 set 对象中
if(it == s.end()) { // cur 不在 set 对象中,就插入到 set 对象中
s.insert(cur);
} else { // cur 在 set 对象中就带环,并且该节点就是环入口点
return *it;
}
cur = cur->next;
}
return nullptr;
}
};
两个数组中的交集
题目描述
给定两个数组 nums1 和 nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。
示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
解题思路
暴力遍历虽然可行,但容易因遍历方向不同导致结果重复或错误。更稳健的思路是先对两个数组去重,再取交集。



