1. 两个数组的交集
题目链接:349. 两个数组的交集 - 力扣(LeetCode)
https://leetcode.cn/problems/intersection-of-two-arrays/description/
这题使用set,因为set具有排序和去重的特性
思路:
1.两个值相等就是交集
2.小的那个值++,因为是小的那个值,那么后面就一定不会有这个值,那么小的一定不是交集
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{
vector<int> v;
set<int> s1;
set<int> s2;
s1.insert(nums1.begin(),nums1.end());
s2.insert(nums2.begin(),nums2.end());
auto it1 = s1.begin();
auto it2 = s2.begin();
while(it1 != s1.end() && it2 != s2.end())
{
if(*it1 < *it2)
{
it1++;
}
else if(*it1 > *it2)
{
it2++;
}
else
{
v.push_back(*it1);
it1++;
it2++;
}
}
return v;
}
};
在这里提一下如果是找差集的话
2. 环形链表II
题目链接:
142. 环形链表 II - 力扣(LeetCode)
https://leetcode.cn/problems/linked-list-cycle-ii/description/
这题使用set存储的是链表每个节点,当插入到重复的节点时,该节点就是入环的第一个节点,然后直接返回就行
思路:先定义一个set,set里面存储一个节点的指针,用一个指针把链表给遍历一遍,比如说先遍历一个3,用3查找一下在不在set里面,不在的话就把3这个节点的指针的地址放进set里面,然后继续遍历,当再次遍历到2这个节点时,发现set里面有2这个节点的地址,那么就说明这个链表是环形链表,并且2是这个环形链表的入口点
class Solution {
public:
ListNode *detectCycle(ListNode *head)
{
set<ListNode*> L;
ListNode* cur = head;
while(cur)
{
if(L.count(cur))
{
return cur;
}
else
{
L.insert(cur);
}
cur = cur->next;
}
return nullptr;
}
};
完结撒花~