[更文刷题] 83. 删除排序链表中的重复元素

121 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

一、题目描述:

83. 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)

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

示例 1:

image.png

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

示例 2:

image.png

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

提示:

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

二、思路分析:

本题的主要技巧在于快慢指针。

注意点:

  1. 快指针fast在while的循环条件是fast是否存在,而不是fast.next是否存在(因为会跳过最后一个链表元素);
  2. slow.next指向fast(作为一个链表结构,而不是fast.val);
  3. 快指针走完之后,慢指针切断后面的元素,slow.next=None;
  4. 最后返回原始头节点head即可

三、AC 代码:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */

var deleteDuplicates = function(head) {
    let current = head //把首节点指针赋值给current
    while(current && current.next) { //当前节点以及下一节点不为空时
        if(current.val === current.next.val) { //值相等
            current.next = current.next.next
        }else {
            current = current.next //值不相等
        }
    }
    return head //返回首节点
}


// 易于理解版,这个逻辑与上面大同小异,只是写的详细点

var deleteDuplicates = function(head) {
    if(!head) return null
    let q = head
    let p = q.next
    while(p) {
        if(q.val === p.val) {
            q.next = p.next
            p = null
            p = q.next
        }else {
            q = p
            p = p.next
        }
    }
    return head
};

范文参考:

C语言 题解 - 删除排序链表中的重复元素 - 力扣(LeetCode)

排序数组去除重复项比较优的解法 - 删除排序链表中的重复元素 - 力扣(LeetCode)

js删除排序链表中的重复元素 - 删除排序链表中的重复元素 - 力扣(LeetCode)