假设我们给了个头;这是包含唯一整数值的链表的头节点。现在,我们还获得了列表G,它是链接列表中值的子集。我们必须找到G中已连接组件的数量,如果两个值连续出现在链表中,则两个值将被连接。因此,如果列表类似于[0,1,2,3]且G = [0,1,3],则输出将为2,因为连接了0和1,所以有两个列表[0,1]和[3]。
为了解决这个问题,我们将遵循以下步骤-
ret:= 0,设置set,然后将G的所有元素插入s
标志:=假
而head不为null
如果标志为假,则将ret增加1
标志:= true
x:=头值
如果s有x,则
否则设置标志:= false
头:=头的下一个
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class ListNode{ public: int val; ListNode *next; ListNode(int data){ val = data; next = NULL; } }; ListNode *make_list(vector<int> v){ ListNode *head = new ListNode(v[0]); for(int i = 1; i<v.size(); i++){ ListNode *ptr = head; while(ptr->next != NULL){ ptr = ptr->next; } ptr->next = new ListNode(v[i]); } return head; } class Solution { public: int numComponents(ListNode* head, vector<int>& G) { int ret = 0; set < int > s; for(int i = 0; i < G.size(); i++)s.insert(G[i]); bool flag = false; while(head){ int x = head->val; if(s.count(x)){ if(!flag) ret++; flag = true; }else flag = false; head = head->next; } return ret; } }; main(){ vector<int> v1 = {0,1,2,3}; vector<int> v2 = {0,1,3}; ListNode *h1 = make_list(v1); Solution ob; cout << (ob.numComponents(h1, v2)); }
[0,1,2,3] [0,1,3]
输出结果
2