LeetCode探索(148):817-链表组件

58 阅读2分钟

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

题目

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

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

示例 1:

img

输入: head = [0,1,2,3], nums = [0,1,3]
输出: 2
解释: 链表中,0 和 1 是相连接的,且 nums 中不包含 2,所以 [0, 1] 是 nums 的一个组件,同理 [3] 也是一个组件,故返回 2。

示例 2:

img

输入: head = [0,1,2,3,4], nums = [0,3,1,4]
输出: 2
解释: 链表中,0 和 1 是相连接的,3 和 4 是相连接的,所以 [0, 1][3, 4] 是两个组件,故返回 2。

提示:

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

思考

本题难度中等。

首先是读懂题意。给定链表头结点 head 和列表 nums,该列表是上述链表中整型值的一个子集。我们需要返回列表 nums 中组件的个数。

我们可以定义哈希表set,存储nums中的元素。定义变量inSet表示当前节点的前一个节点是否在数组nums中,默认是false。定义ans表示 nums 中组件的个数。

遍历链表head,如果当前节点的值在set中,且inSet是false,则ans++。最后返回ans即可。需要注意的是:

  • 链表head中每个节点的值都是唯一的整数。

  • 列表nums中的组件指的是该组件中的值在head中是连续的节点,比如链表[0,1,2,3], nums = [0,1,3]中包含了[0,1]和[3]这两个组件。

解答

方法一:模拟

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number[]} nums
 * @return {number}
 */
var numComponents = function(head, nums) {
  let ans = 0
  let set = new Set(nums)
  let inSet = false
  while (head) {
    if (!set.has(head.val)) {
      inSet = false
    } else {
      if (!inSet) {
        inSet = true
        ans++
      }
    }
    head = head.next
  }
  return ans
}
// 执行用时:64 ms, 在所有 JavaScript 提交中击败了97.73%的用户
// 内存消耗:46.4 MB, 在所有 JavaScript 提交中击败了34.09%的用户
// 通过测试用例:57 / 57

复杂度分析:

  • 时间复杂度:O(n),其中 n 是链表 head 的长度,需要遍历一遍链表。
  • 空间复杂度:O(m),其中 m 是数组 nums 的长度,需要一个哈希集合来存储 nums 的元素。

参考