【每日一题记录】 链表组件

25 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

大家好 我是丝瓜咸蛋汤。今天带来的是一道在LeetCode上的题目,题目难度为中等。就在此为大家分享一下解答思路。

题目阐述

给定链表头结点 head,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums,该列表是上述链表中整型值的一个子集。

返回列表 nums 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 nums 中)构成的集合。

来源:力扣(LeetCode)

思路阐述

其实这道题目 读懂题目比完成代码花的时间还长。。。。
题目的意思是计算val在nums里面的组件的个数

也就是说,不是再求最长子组件的长度

所以操作起来真的很简单,用一个set转存就完事了,读题理解时间比操作时间还长。。。

代码实现

function numComponents(head: ListNode | null, nums: number[]): number {
    let set = new Set<number>()
    for (const i of nums) set.add(i)
    let res = 0
    // let cur = 0
    while (head != null) {
        if (set.has(head.val)) {
            while (head != null && set.has(head.val)) {
                head = head.next
            }
            res++
            // res = Math.max(cur, res)
        }
        else {
            head = head.next
        }
    }
    return res
};

运行结果

执行用时:80 ms, 在所有 TypeScript 提交中击败了53.33%的用户

内存消耗:46.9 MB, 在所有 TypeScript 提交中击败了93.33%的用户

通过测试用例:57 / 57

其他解法

这里是来自评论区的一道来自java的解法:

public int numComponents(ListNode head, int[] nums) {
        //题目限制链长不超过10000,题目限制每个head.val值唯一
        boolean[] flag=new boolean[10001];
        //判断哪个值有
        for(int num:nums)flag[num]=true;
        //pre记录前一个值存不存在,result记录链长
        int res=0;boolean pre=false;
        while(head!=null){
            //如果前一个值不存在而当前遍历到的节点的值存在,则res+1
            if(!pre&&flag[head.val])res++;
            //记录当前遍历到的节点的值存在与否
            pre=flag[head.val];
            //继续遍历
            head=head.next;
        }
        return res;
    }

这个思路比较直接 通过一个布尔类的判断数组去判断前后节点的状况,从而打到一次遍历解决问题。

我是丝瓜咸蛋汤
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!

名片.jpg