817. Linked List Components**
https://leetcode.com/problems/linked-list-components/
题目描述
We are given head, the head node of a linked list containing unique integer values.
We are also given the list G
, a subset of the values in the linked list.
Return the number of connected components in G
, where two values are connected if they appear consecutively in the linked list.
Example 1:
Input:
head: 0->1->2->3
G = [0, 1, 3]
Output: 2
Explanation:
0 and 1 are connected, so [0, 1] and [3] are the two connected components.
Example 2:
Input:
head: 0->1->2->3->4
G = [0, 3, 1, 4]
Output: 2
Explanation:
0 and 1 are connected, 3 and 4 are connected, so [0, 1] and [3, 4] are the two connected components.
Note:
- If
N
is the length of the linked list given by head,1 <= N <= 10000
. - The value of each node in the linked list will be in the range
[0, N - 1]
. 1 <= G.length <= 10000
.G
is a subset of all values in the linked list.
C++ 实现 1
这道题关键要读懂题意, 首先链表中的值都是 unique 的, G
中的值来自链表中的节点, 那么需要求 G
中有多少个联通分量. 比如:
链表: 1->2->3->4->5->6->7->8
G : [1, 2, 3, 5, 6, 8]
那么联通分量就有三条, 分别是:
1->2->3
5->6
8->
于是我们知道了取得联通分量的条件, 最后一个节点在 record
中无法查找到后继.
class Solution {
public:
int numComponents(ListNode* head, vector<int>& G) {
unordered_set<int> record(G.begin(), G.end());
auto p = head;
int res = 0;
while (p) {
if (record.count(p->val) && (!p->next || !record.count(p->next->val)))
res ++;
p = p->next;
}
return res;
}
};