环形链表检测
题目描述
给定一个链表的头节点 head,返回链表开始入环的第一个节点。如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。注意不允许修改 链表。
解题思路
关于快慢指针的经典解法,之前有过详细探讨,这里我们直接用 C++ STL 来简化实现。核心逻辑是利用哈希集合 set 遍历链表:
- 如果当前节点不在
set中,就插入该节点的指针(注意是节点地址而非值,因为节点值可能重复)。 - 如果当前节点已经在
set中,说明遇到了重复访问的节点,即发现环,且该节点就是环的入口点。
代码实现
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
std::set<ListNode*> s;
ListNode* cur = head;
while(cur) {
auto it = s.find(cur);
if(it == s.end()) {
s.insert(cur);
} else {
return *it;
}
cur = cur->next;
}
return nullptr;
}
};
两个数组中的交集
题目描述
给定两个数组 nums1 和 nums2,返回它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。
解题思路
暴力遍历虽然可行,但容易受数组选择影响导致结果错误。更稳健的思路是先对两个数组去重,再查找共同元素。
利用 STL 中的 set 容器天然具有去重功能,将两个数组分别转为 set,然后遍历其中一个集合,检查元素是否存在于另一个集合中。
此外,这种对比算法在实际场景中非常常见,比如数据同步或去重处理。当需要比较两套数据的差异时,有序对比往往比无序遍历更高效。
代码实现
class {
:
{
;
;
vector<> v;
( e : s1) {
(s(e)) {
v.(e);
}
}
v;
}
};


