LeetCode算法:移除重复节点&返回倒数第 k 个节点

67 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 11 天,点击查看活动详情

移除重复节点

题目描述

移除重复节点

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

示例1:

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

示例2:

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

提示:

  • 链表长度在[0, 20000]范围内。
  • 链表元素在[0, 20000]范围内。

思路分析

  1. 定义一个对象 res 来存储链表中节点的内容,key 为链表某个节点的值,valuetrue
  2. 遍历链表,若 res 中存在某个节点,则跳过当前节点,并且 prev.next = current.next;若不存在,则将 res 中当前节点的 value 值置为 true,并且使得 prev = current
  3. 最后返回 head 即可。

AC 代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var removeDuplicateNodes = function(head) {
    const res = {}
    for (let prev = null, current = head; current !== null; current = current.next) {
        if (res[current.val]) {
            prev.next = current.next
        } else {
            res[current.val] = true
            prev = current
        }
    }
    return head
};

结果:

  • 执行结果: 通过
  • 执行用时:76 ms, 在所有 JavaScript 提交中击败了87.71%的用户
  • 内存消耗:47 MB, 在所有 JavaScript 提交中击败了71.33%的用户
  • 通过测试用例:35 / 35

返回倒数第 k 个节点

题目描述

原题地址

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

**注意:**本题相对原题稍作改动

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4

说明:

  • 给定的 k 保证是有效的。

思路分析

  1. 可以借助数组做辅助工具来取值;
  2. 首先将链表转换为数组,在 head 不为空的情况下,将 head.val 存入数组中,使得 head = head.next
  3. 得到数组后,想要获取倒数第 k 个节点,正序的下标即为 res.length - k,按照这个下标获取数组对应的值返回即可。

AC 代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {number}
 */
var kthToLast = function(head, k) {
    const res = []
    while (head) {
        res.push(head.val)
        head = head.next
    }
    return res[res.length - k]
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了20.80%的用户
  • 内存消耗:41.2 MB, 在所有 JavaScript 提交中击败了47.01%的用户
  • 通过测试用例:208 / 208

END