LeetCode817.链表组件

题目描述:
给定一个链表(链表结点包含一个整型值)的头结点 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。
按照题目解释可知G中所包含的值只要连续的存在于预定的链表中,不论是一个,还是多个,组件数都是加一,那上边的两个示例举例,示例一G中有0,1,3,可以看到01相连且0和1都处于所给链表相连位置,也就是01就是链表中最长连续节点的值,同理3自己就可以看作是一个连续节点所以有0~1和3共两个组件,所以返回2.
而在示例二中,G中01,34为对应链表中节点且相连,所以也是两个组件,返回2.
读懂题目之后我们开始使用代码实现:

struct ListNode {
int val;
struct ListNode *next;
};
typedef struct ListNode Node;

int numComponents(struct ListNode* head, int* G, int GSize){
int arr[10000];
int i;
Node p = head;
int cnt = 0;
int last_flag = 0;/
用于标志上一个节点是否存在于G中 */

memset(arr, 0, sizeof(int) * 10000);

/* arr哈希表,用于记录G中存在的数字,O(1)查找时间复杂度 */
for(i=0; i<GSize; i++){
    arr[G[i]]++;
}

while(p){
    if(arr[p->val]){
        /* 上一个节点不存在G中时,本节点存在G中时,才将总数+1 */
        if(last_flag == 0){
            cnt++;
        }
        
        last_flag = 1;
    }else{
        last_flag = 0;
    }
    
    p = p->next;
}

return cnt;

}
总体思路就是创建一个哈希表用于记录G,也就是元素均为链表元素整型值子集的那个链表,在哈希表标记之后遍历链表,如果链表中的值在哈希表中有标记那就继续,直到链表中的值不在哈希表中,那么,计数加一,为防止出现遍历链表时计数出错,所以设置last_flag作为链表中元素是否在G中的标志,当上一个节点不存在于G且本节点存在于G时,才将计数加一,最后就可以成功返回总共的组件的数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值