题目描述:
给定链表头结点 head,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums,该列表是上述链表中整型值的一个子集。
返回列表 nums 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 nums 中)构成的集合。
Level | AC rate |
Medium | 61.0% |
题目解析:
要想知道我们通过一个列表将链表分为了多少个子集的话,我们只需要判断有多少个子集的开头那么就有多少个子集,一个数如何能够成为子集的开头呢,首先一个数要在我们的列表中,并且这个数的前一个数不能够存在于我们的链表中。因为如果这个数在链表中的前一个数存在列表中的话那么说明这个数仍属于上一个子集,并不能成为一个新的子集的开头,大致思路就是这样,代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
int numComponents(ListNode* head, vector<int>& nums) {
unordered_set<int> uset;
for(int i = 0 ; i<nums.size() ; i++){
uset.emplace(nums[i]);
}
bool conta = false;
int cnt(0);
while(head!=nullptr){
if(uset.count(head->val)){
if(!conta){
conta = true;
cnt++;
}
}
else conta = false;
head = head->next;
}
return cnt;
}
};
执行用时:36 ms, 在所有 C++ 提交中击败了45.42%的用户
内存消耗:21 MB, 在所有 C++ 提交中击败了31.30%的用户