LeetCode 3217.从链表中移除在数组中存在的节点:哈希表(一次遍历)

【LetMeFly】3217.从链表中移除在数组中存在的节点:哈希表(一次遍历)

力扣题目链接:https://leetcode.cn/problems/delete-nodes-from-linked-list-present-in-array/

给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除 所有存在于 nums 中的节点后,返回修改后的链表的头节点。

示例 1:
输入: nums = 1,2,3, head = 1,2,3,4,5

输出: 4,5

解释:

移除数值为 1, 2 和 3 的节点。

示例 2:
输入: nums = 1, head = 1,2,1,2,1,2

输出: 2,2,2

解释:

移除数值为 1 的节点。

示例 3:
输入: nums = 5, head = 1,2,3,4

输出: 1,2,3,4

解释:

链表中不存在值为 5 的节点。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105
  • nums 中的所有元素都是唯一的。
  • 链表中的节点数在 [1, 105] 的范围内。
  • 1 <= Node.val <= 105
  • 输入保证链表中至少有一个值没有在 nums 中出现过。

解题方法:哈希表

使用哈希表记录 n u m s nums nums中都出现了哪些元素。

为了方便可以在链表第一个节点前设置一个一定不会被删除的没有实际值的"表头",并使用两个变量 l a s t last last和 n o w now now记录上一个遍历到的节点和当前节点。

在 n o w now now不为空时,若 n o w now now在 n u m s nums nums中出现过,则扔掉 n o w now now(更新 l a s t last last的 n e x t next next为 n o w now now的 n e x t next next、 n o w now now后移);否则不删 n o w now now( l a s t last last和 n o w now now都指向下一个节点)。

  • 时间复杂度 O ( l e n ( n u m s ) + l e n ( l i s t ) ) O(len(nums) + len(list)) O(len(nums)+len(list))
  • 空间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums))

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2025-11-01 21:54:45
 */

/**
 * 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* now) {
        unordered_set<int> se(nums.begin(), nums.end());
        ListNode* head = new ListNode(0, now);  // 不可以:ListNode* head(0, now);
        ListNode* last = head;
        while (now) {
            if (se.count(now->val)) {
                now = now->next;
                last->next = now;
            } else {
                last = now;
                now = now->next;
            }
        }
        return head->next;
    }
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
不负岁月无痕8 小时前
STL --C++哈希表封装unordered_map/set
c++·visualstudio·哈希算法·散列表·unordered
从零开始的代码生活_1 天前
C++ list 原理与实践:双向链表、迭代器与简化实现
开发语言·c++·后端·学习·算法·链表·list
晚笙coding1 天前
LeetCode 226. 翻转二叉树(Invert Binary Tree)
算法·leetcode·职场和发展
退休倒计时1 天前
【每日一题】LeetCode 287. 寻找重复数 TypeScript
算法·leetcode·typescript
G.O.G.O.G1 天前
《LeetCode SQL 从入门到精通(MySQL)》09
sql·mysql·leetcode
To_OC2 天前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC2 天前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
兰令水2 天前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
tachibana22 天前
hot100 课程表(207)
java·数据结构·算法·leetcode
旖-旎2 天前
《LeetCode 646 最长数对链 || LeetCode 1143 最长公共子序列》
c++·算法·leetcode·动态规划