Delete Nodes From Linked List Present in Array

medium linked list hash table set lookup

Problem

You are given an array of integers nums and the head of a linked list. Return the head of the modified list after removing every node whose value exists in nums. Because nums elements are unique, a hash set lets us test each node in O(1), so the whole list is cleaned in one pass.

Inputnums = [1,2,3], head = [1,2,3,4,5]
Output[4,5]
Nodes 1, 2, and 3 are in the set, so they are unlinked; 4 and 5 survive.

def modifiedList(nums, head):
    to_delete = set(nums)               # O(1) membership tests
    dummy = ListNode(0, head)           # sentinel before head
    prev = dummy
    cur = head
    while cur:
        if cur.val in to_delete:
            prev.next = cur.next        # unlink the matching node
        else:
            prev = cur                  # keep node, advance prev
        cur = cur.next
    return dummy.next
function modifiedList(nums, head) {
  const toDelete = new Set(nums);          // O(1) membership tests
  const dummy = new ListNode(0, head);     // sentinel before head
  let prev = dummy;
  let cur = head;
  while (cur) {
    if (toDelete.has(cur.val)) {
      prev.next = cur.next;                // unlink the matching node
    } else {
      prev = cur;                          // keep node, advance prev
    }
    cur = cur.next;
  }
  return dummy.next;
}
ListNode modifiedList(int[] nums, ListNode head) {
    Set<Integer> toDelete = new HashSet<>();
    for (int n : nums) toDelete.add(n);      // O(1) membership tests
    ListNode dummy = new ListNode(0, head);  // sentinel before head
    ListNode prev = dummy, cur = head;
    while (cur != null) {
        if (toDelete.contains(cur.val)) {
            prev.next = cur.next;            // unlink the matching node
        } else {
            prev = cur;                      // keep node, advance prev
        }
        cur = cur.next;
    }
    return dummy.next;
}
ListNode* modifiedList(vector<int>& nums, ListNode* head) {
    unordered_set<int> toDelete(nums.begin(), nums.end());
    ListNode dummy(0, head);                 // sentinel before head
    ListNode* prev = &dummy;
    ListNode* cur = head;
    while (cur) {
        if (toDelete.count(cur->val)) {
            prev->next = cur->next;          // unlink the matching node
        } else {
            prev = cur;                      // keep node, advance prev
        }
        cur = cur->next;
    }
    return dummy.next;
}
Time: O(n + m) Space: O(m)