leetcode-链表-82- 删除排序链表中的重复元素 II

192 阅读2分钟

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

今天讲解的是链表系列的1道题:

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

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

leetcode地址:leetcode.cn/problems/re…

难度

中等

描述

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

示例 1:

image.png


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

示例 2:

image.png

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

 

提示:

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

解法

1.定义虚拟头节点dummyHead,指向链表第一个节点

2.定义变量cur指向虚拟头节点

3.开始遍历,当cur.next 和 cur.next.next存在的时候

4.判断当 第一个节点和第二个节点的值相等(cur.next.val === cur.next.next.val),此时定义变量val,来存储这个相同的值,也就是cur.next.val。遍历链表,将所有等于val的值,全部删除。这样就删除了所有重复的元素

5.如果第一个节点和第二个节点的值不相等,将变量cur向前移动: cur = cur.next

6.最后返回真实的头节点dummyHead.next

接下来我们通过手写代码的方式,按照上述分析的思路来实现一下这道算法题

代码

/*
 * @lc app=leetcode.cn id=82 lang=javascript
 *
 * [82] 删除排序链表中的重复元素 II
 */

// @lc code=start
/**
 * 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) {
    let dummyHead = new ListNode(0);
    dummyHead.next = head;

    let cur = dummyHead;

    while(cur.next && cur.next.next){
        if(cur.next.val === cur.next.next.val){
            let val = cur.next.val;

            while(cur.next && cur.next.val === val){
                cur.next = cur.next.next;
            }
        }else{
            cur = cur.next;
        }
    }

    return dummyHead.next;
};

// @lc code=end