The Indian Engineer

Problem 3217 Delete Nodes From Linked List Present in Array

Posted on 2 mins

Linked-List Pointers

Problem Statement

Link - Problem 3217

Question

You are given an array of integers nums and the head of a linked list. Return the head of the modified linked list after removing all nodes from the linked list that have a value that exists in nums.

Example 1

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

Output: [4,5]

Example 2

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

Output: [2,2,2]

Example 3

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

Output: [1,2,3,4]

Constraints

- `1 <= nums.length <= 10^5`
- `1 <= nums[i] <= 10^5`
- All elements in `nums` are unique.
- `The number of nodes in the given list is in the range [1, 10^5]`.
- `1 <= Node.val <= 10^5`
- The input is generated such that there is at least one node in the linked list that has a value not present in `nums`.

Solution

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* modifiedList(vector<int>& nums, ListNode* head) {
       unordered_set<int> s(nums.begin(),nums.end());

        ListNode * ans=head;

        while(ans!=nullptr && s.find(ans->val)!=s.end()){
            ans=ans->next;
        }

        head=ans;

        while(head!=nullptr && head->next!=nullptr){
            if(s.find(head->next->val)!=s.end()){
                head->next=head->next->next;
            }
            else{
                head=head->next;
            }
        }
        return ans;
    }
};

Complexity Analysis

| Algorithm         | Time Complexity | Space Complexity |
| ----------------- | --------------- | ---------------- |
| Pointer Traversal | O(n)            | O(n)             |

Explanation

1. Intuition

- Use a hash set to store the elements of the array.
- This will be used for lookup.
- Initialize a pointer to the head of the linked list.
- Traverse the linked list and remove the nodes which are present in the hash set.

2. Implementation

- Initialize a hash set `s` with the elements of the array.
- Initialize a pointer `ans` to the head of the linked list.
- While `ans` is not null and the value of `ans` is present in the hash set, move `ans` to the next node.
- Update the head of the linked list to `ans`.
- While the head of the linked list is not null and the next node of the head is not null:
  - If the value of the next node of the head is present in the hash set, `head->next` will point to the next node of the next node.
  - Else move the head to the next node.
- Return the head of the linked list.