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

1.4 题目思路:
在之前的讲解中介绍过 C 语言的快慢指针方法,C 语言相对复杂,这里我们使用 C++ STL 实现。利用 STL 的 set 遍历链表,如果链表中的节点不在 set 中就插入(注意这里不是插入节点的值,而是节点的指针,因为节点的值可能有几个相等);如果在就代表带环,并且该节点就是环入口点。
1.5 解决代码
// 1 cur 不在 set 对象中,就插入到 set 对象中
// 2 cur 在 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;
}
};
二 两个数组中的交集
2.1 题目链接:两个数组的交集





