LeetCode 分类刷题:3217. 从链表中移除在数组中存在的节点

题目

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

解析

对于本题,由于直接判断节点值是否在 nums 中,需要遍历 nums,时间复杂度为 O(n)。把 nums 中的元素保存一个哈希集合中,然后判断节点值是否在哈希集合中,这样可以做到 O(1)。

具体做法:

  1. 把 nums 中的元素保存到一个哈希集合中。
  2. 由于头节点可能会被删除,在头节点前面插入一个哨兵节点 dummy,以简化代码逻辑。
  3. 初始化 cur=dummy。
  4. 遍历链表,如果 cur 的下一个节点的值在哈希集合中,则需要删除,更新 cur.next 为 cur.next.next;否则不删除,更新 cur 为 cur.next。
  5. 循环结束后,返回 dummy.next。

作者:灵茶山艾府

链接:https://leetcode.cn/problems/delete-nodes-from-linked-list-present-in-array/solutions/2843071/shao-bing-jie-dian-yi-ci-bian-li-pythonj-imre/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

答案

javascript 复制代码
var modifiedList = function(nums, head) {
    const set = new Set(nums);
    const dummy = new ListNode(0, head);
    let cur = dummy;
    while (cur.next) {
        const nxt = cur.next;
        if (set.has(nxt.val)) {
            cur.next = nxt.next; // 从链表中删除 nxt 节点
        } else {
            cur = nxt; // 不删除 nxt,继续向后遍历链表
        }
    }
    return dummy.next;
};

// 作者:灵茶山艾府
// 链接:https://leetcode.cn/problems/delete-nodes-from-linked-list-present-in-array/solutions/2843071/shao-bing-jie-dian-yi-ci-bian-li-pythonj-imre/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复杂度分析

时间复杂度:O(n+m),其中 n 是 nums 的长度,m 是链表的长度。

空间复杂度:O(n)。

具体分析

  1. 创建 Set :new Set(nums) - 这是 O(n)

  2. 遍历链表 :while (cur.next) - 这是 O(m)

  3. Set 查询 :set.has(nxt.val) - 每次都是 O(1)

相关推荐
晓得迷路了24 分钟前
栗子前端技术周刊第 148 期 - Turborepo 2.11、Chrome 154 iframe、Node.js 26...
前端·javascript·css
默_笙6 小时前
🚓 分诊台与拆题术:让 RAG 学会判断和规划
前端·javascript
呃呃呃呃ex6 小时前
10. 现代前端工程化:ES6 React 项目实战与原理解析
前端·javascript
浪遏6 小时前
D2C 系统架构复盘:从设计稿到代码,我们踩过的坑和最终方案
前端·javascript·后端
Blanche15006 小时前
Webpack 构建流程解析
javascript·面试
Flynt6 小时前
官方说一个破折号拖慢整段高亮,我在 Node 里验证了一遍:机制是真的,2.8 倍没跑出来
javascript·性能优化·v8
默_笙6 小时前
🚗 把小说装进数据库了:我的第一个 RAG,和它的五个硬伤
前端·javascript
像我这样帅的人丶你还7 小时前
📱iPhone Duo 开屏动画咋实现的?
javascript·webgl·three.js
Leslie1657 小时前
把 SQL 性能诊断接入模型 API:从谓词分析到可验证优化
javascript
gnip7 小时前
UniApp 内嵌 H5 通信全攻略
前端·javascript