1. 程式人生 > >leetcode刷題系列之817. 連結串列元件

leetcode刷題系列之817. 連結串列元件

給定一個連結串列(連結串列結點包含一個整型值)的頭結點 head

同時給定列表 G,該列表是上述連結串列中整型值的一個子集。

返回列表 G 中元件的個數,這裡對元件的定義為:連結串列中一段最長連續結點的值(該值必須在列表 G 中)構成的集合。示例 1:head: 0->1->2->3

G = [0, 1, 3]
輸出: 2
解釋: 
連結串列中,0 和 1 是相連線的,且 G 中不包含 2,所以 [0, 1] 是 G 的一個元件,同理 [3] 也是一個元件,故返回 2。

示例 2:

輸入: 
head: 0->1->2->3->4
G = [0, 3, 1, 4]
輸出:
2 解釋: 連結串列中,0 和 1 是相連線的,3 和 4 是相連線的,所以 [0, 1] 和 [3, 4] 是兩個元件,故返回 2。

一、解題思路

用指標p表示當前連結串列結點,p一開始為head頭結點,我們從G中挨個遍歷,如果能找到,說明p的val在G中存在,這時,把p後移一個,即p=p->next,再在G(從G[0]到G[n-1])中找p的值,如果找到,同樣進香行操作,直到在中找不到p->val為止。此時,元件的個數加1。

二、leetcode程式碼

class Solution {
public:
    int numComponents(ListNode* head, vector<int>& G) {
        if(!head||G.empty())  return 0;
        int num=0;//記錄元件個數
        ListNode* p=head;
        while(p){
            int t=0;
            for(int i=0;i<G.size();i++){
                if(G[i]==p->val) {//G中找到了p->val
                    p=p->next;//p後移一個
                    i=-1;//G從頭開始找p->val的值
                    t++;//記錄一個元件的長度 
                    if(!p) break; 
                }
            }
            if(t) {num++;}//continue;}//元件長度不為0,元件個數加1
            if(!p) break; 
            p=p->next;
        }
        return num;
    }
};