817. Linked List Components**

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;
    }
};
发布了455 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Eric_1993/article/details/104914712