LeetCode in Kotlin

817. Linked List Components

Medium

You are given the head of a linked list containing unique integer values and an integer array nums that is a subset of the linked list values.

Return the number of connected components in nums where two values are connected if they appear consecutively in the linked list.

Example 1:

Input: head = [0,1,2,3], nums = [0,1,3]

Output: 2

Explanation: 0 and 1 are connected, so [0, 1] and [3] are the two connected components.

Example 2:

Input: head = [0,1,2,3,4], nums = [0,3,1,4]

Output: 2

Explanation: 0 and 1 are connected, 3 and 4 are connected, so [0, 1] and [3, 4] are the two connected components.

Constraints:

Solution

import com_github_leetcode.ListNode

/*
 * Example:
 * var li = ListNode(5)
 * var v = li.`val`
 * Definition for singly-linked list.
 * class ListNode(var `val`: Int) {
 *     var next: ListNode? = null
 * }
 */
@Suppress("NAME_SHADOWING")
class Solution {
    fun numComponents(head: ListNode?, nums: IntArray): Int {
        var head = head
        val set: HashSet<Int> = HashSet()
        for (i in nums) {
            set.add(i)
        }
        var result = 0
        while (head != null) {
            if (set.contains(head.`val`)) {
                while (head != null && set.contains(head.`val`)) {
                    head = head.next
                }
                result++
            } else {
                head = head.next
            }
        }
        return result
    }
}