【DAY29】LeetCode力扣算法题 [817. 链表组件 ]

在这里插入图片描述

在这里插入图片描述

刷题打卡,第 二十九 天


题目一、817. 链表组件

原题链接:817. 链表组件

题目描述

给定链表头结点 head,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums,该列表是上述链表中整型值的一个子集。
返回列表 nums 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 nums 中)构成的集合。
/
示例 1:
在这里插入图片描述
输入: head = [0,1,2,3], nums = [0,1,3]
输出: 2
解释: 链表中,0 和 1 是相连接的,且 nums 中不包含 2,所以 [0, 1] 是 nums 的一个组件,同理 [3] 也是一个组件,故返回 2。
/
示例 2:
在这里插入图片描述
输入: head = [0,1,2,3,4], nums = [0,3,1,4]
输出: 2
解释: 链表中,0 和 1 是相连接的,3 和 4 是相连接的,所以 [0, 1] 和 [3, 4] 是两个组件,故返回 2。
/
提示:

  • 链表中节点数为n
  • 1 <= n <= 104
  • 0 <= Node.val < n
  • Node.val 中所有值 不同
  • 1 <= nums.length <= n
  • 0 <= nums[i] < n
  • nums 中所有值 不同

解题思路
题目要求我们在链表的节点子集nums中找到符合题目要求的组件,并返回组件数量。

根据题目知道组件就是链表中某一段最长连续结点的值(该值必须在列表 nums 中)构成的集合。

我们可以遍历链表节点,如果链表节点是子集nums中的组件开头,我们就记录下组件的数量。

判断当前节点是组件开头的两个依据:

①链表节点存在于子集nums中,且当前节点是链表头节点,组件数+1

②链表节点存在于子集nums中,且前一个节点不存在与自己中,组件数+1,为了确定前一个节点是否在子集中,我们需要使用一个布尔类型来记录。

遍历完之后返回记录下的组件数即可。

提交代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public int numComponents(ListNode head, int[] nums) {
        Set<Integer> set = new HashSet<>();  //创建不可重复集合Set
        int total = 0;                       //total记录组件数量
        for(int num : nums){                 //遍历子串数组
            set.add(num);                    //元素存入集合中
        }
        boolean flag = false;                //设置标记,判定头节点以及前一个结点是否不在子串中
        while(head != null){                 //遍历链表
            if(set.contains(head.val)){      //节点在子串中存在
                if(flag == false){           //为头节点或前一个结点不在子串中
                    flag = true;             //flag设置为true
                    ++total;                 //组件+1
                }
            }
            else{                            //不为组件开头元素
                flag = false;                //设置flag为false
            }
            head = head.next;                //继续i向后遍历数组
        }
        return total;                        //返回记录的组件数量
    }
}

提交结果
在这里插入图片描述


求关注⚽ 作者🥇 .29. 🥇 的✔博客主页✔
来刷题⚽ 记录每日LeetCode✔刷题专栏✔
您的点赞收藏以及关注是对作者最大的鼓励喔 ~~

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.29.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值