一、环形链表
1.1 题目描述
给定一个链表的头节点 head,返回链表开始入环的第一个节点。如果链表无环,则返回 null。
为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。注意不允许修改链表。
1.2 解题思路
检测环入口通常有两种主流方法:快慢指针法或哈希集合遍历。
这里我们采用 C++ STL 的 set 容器来遍历链表。核心逻辑很简单:如果链表中的节点不在 set 中就插入;如果在就代表带环,且该节点就是环入口点。需要注意的是,这里存储的是节点的指针而非值,因为节点的值可能有重复,而指针地址是唯一的。
1.3 代码实现
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;
}
};
二、两个数组中的交集
2.1 题目描述
给定两个数组 nums1 和 nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。
2.2 解题思路
暴力遍历虽然可行,但容易受数组大小和重复元素影响。例如示例中若拿 nums2 的值去 nums1 遍历,可能会得到重复结果。
更稳健的思路是先对两个数组去重,再取交集。利用 STL 中的 set 天然有序且去重的特性,可以将一个数组的值依次在另一个数组中查找,找到后存入结果容器即可。
2.3 代码实现
class Solution {
public:
vector<int> intersection(vector<>& nums1, vector<>& nums2) {
;
;
vector<> v;
( e : s1) {
(s(e)) {
v.(e);
}
}
v;
}
};


