DAILY DOCDAILY DOC
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
  • Array

    • 数组
    • 二分查找
    • moveZeros
  • Dynamic-programming

    • 动态规划
  • 刷题指南
  • String

    • 字符串
  • bitwise-operator

    • 位运算符
  • heap
  • history

    • [1014] 最佳观光组合
    • [1022] 从根到叶的二进制数之和
    • [104] 二叉树的最大深度
    • [11] 盛最多水的容器
    • [110] 平衡二叉树
    • [1227] 飞机座位分配概率
    • [129] 求根节点到叶节点数字之和
    • [1306] 跳跃游戏 III
    • [148] 排序链表
    • 155.最小栈
    • [165] 比较版本号
    • 1763. 最长的美好子字符串
    • [1870] 准时到达的列车最小时速
    • [199] 二叉树的右视图
    • [21] 合并两个有序链表
    • 215.数组中的第 k 个最大元素
    • [2306] 公司命名
    • [234] 回文链表
    • [2516] 每种字符至少取 K 个
    • [316] 去除重复字母
    • [3171] 找到按位或最接近 K 的子数组
    • [322] 零钱兑换
    • [41] 缺失的第一个正数
    • [44] 通配符匹配
    • [494] 目标和
    • [509] 斐波那契数
    • [518] 零钱兑换 II
    • [62] 不同路径
    • [676] 实现一个魔法字典
    • 70 爬楼梯
    • [718] 最长重复子数组
    • [78] 子集
    • [82] 删除排序链表中的重复元素 II
    • [871] 最低加油次数
    • [88] 合并两个有序数组
    • [887] 鸡蛋掉落
    • 958.二叉树的完全性检验
    • [98] 验证二叉搜索树
    • [983] 最低票价
    • leetcode practice
    • 约瑟夫问题
    • 移除重复节点
  • linked-list

    • 706. 设计哈希映射
    • 链表
  • stack

    • stack
  • tree

    • Tree Traversal
    • 二叉树的最近公共祖先
    • 二叉树
    • 题目
  • leetCode 刷题
  • 回溯
  • 排序算法

移除重复节点

面试题 02.01. 移除重复节点

题目要求:编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例

输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]

方法一:使用哈希表

利用哈希表记录已经出现的节点值,然后遍历链表,移除重复节点。

class ListNode {
    constructor(val) {
        this.val = val;
        this.next = null;
    }
}

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var removeDuplicateNodes = function (head) {
    if (!head) return null;

    const seen = new Set();
    let current = head;
    seen.add(current.val);

    while (current.next) {
        if (seen.has(current.next.val)) {
            current.next = current.next.next;
        } else {
            seen.add(current.next.val);
            current = current.next;
        }
    }

    return head;
};

方法二:双重循环(不使用额外空间)

利用双重循环来检查每个节点是否有重复节点。时间复杂度较高,但节省空间。

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var removeDuplicateNodes = function (head) {
    let current = head;

    while (current) {
        let runner = current;
        while (runner.next) {
            if (runner.next.val === current.val) {
                runner.next = runner.next.next;
            } else {
                runner = runner.next;
            }
        }
        current = current.next;
    }

    return head;
};

解释

  • 方法一:
    • 使用哈希表 seen 来记录已访问的节点值。
    • 遍历链表,对于每个节点,如果其值已经存在于 seen 中,则移除该节点;否则,将其值添加到 seen 中。
  • 方法二:
    • 对于每个节点,使用内部循环检查其后续节点中是否有重复节点。
    • 如果发现重复节点,则移除之;否则继续检查下一个节点。

选择使用哈希表的方法可以显著提高算法的效率,但需要额外的空间。

Last Updated:
Contributors: rosendo
Prev
约瑟夫问题