每日一题-LeetCode(83)删除排序链表中的重复元素

103 阅读2分钟

本文首发小呆&小萌的情侣博客,两个前端的学习生活分享小天地,欢迎关注收藏。

前言

今天是小呆刷题的第2天,今天的题目是:力扣(LeetCode)的第83题,删除排序链表中的重复元素

题目要求

给定一个已排序的链表的头 head删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表

示例:

删除排序链表中的重复元素

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

提示:

  • 链表中节点数目在范围[0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序排列

解题思路

由于链表已经按升序排列,所以值相同的两个节点肯定相连。这道题的本质其实与昨天的题一样,只不过数据结构由数组变成了链表。我们依然可以使用双指针算法来解决。

依旧用一张git图来帮助理解代码在循环过程中,及最后的slow.next = null的作用。

删除排序链表中的重复元素

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function(head) {
    if(head === null) return null // 判断链表的边界值
    let fast = head, slow = head
    while(fast !== null) {
        if(fast.val !== slow.val) {
            slow.next = fast  // 
            slow = slow.next
        }
        fast = fast.next
    }
    slow.next = null
    return head
}

由于JavaScript自带垃圾回收机制,会自动回收那些未被引用的链表节点,所以我们无需对它们进行额外的操作来释放内存。

小结

依旧是一道easy难度的题,但是有了昨天的经验,这道题我马上就有了思路,只需要实现代码即可。水滴石穿,坚持下去才能有所收货,加油!

引用

力扣LeetCode的第83题-删除排序链表中的重复元素

双指针技巧秒杀七道数组题目——作者:labuladong