[路飞]_一起刷leetcode 82. 删除排序链表中的重复元素 II

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

题目:

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

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 **的数字。

返回同样按升序排列的结果链表。

示例 1:

输入: head = [1,2,3,3,4,4,5]
输出: [1,2,5]
复制代码

示例 2:

输入: head = [1,1,1,2,3]
输出: [2,3]
复制代码

提示:

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

思路:

  1. 因为链表已经是经过升序排列的,所以我们只需要比较当前节点和下一个节点的值的大小,但是这道题比较难一点,它需要把原来的元素也进行删除, 新增变量isDup记录是否删除当前节点;
  2. 可能头指针需要删除,为了避免每次循环进行判断, 我们在头指针前面插入一个节点result
  3. 因为待会儿要返回整个链表,所以我们找个需要找个代跑prev, 以保留result头指针的位置;
  4. 这样子我们每次只需要比较当前节点prev.next和下个节点prev.next.next是否相同即可, 到这里可能有点绕,因为我们要可能要删除当前节点, 所以我们直接赋值prev为当前节点,而需要往前取一个元素;
  5. 如果当前节点与下一个节点的值相同,删除下一个元素,同时标记一下isDup = true, 先继续匹配还有没有相同的值, 如果没有了下一轮删除掉当前节点。

实现:

/**
 * 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 isDup = false;

    let result = new ListNode(0, head);
    let prev = result;

    // prev.next指当前节点, prev.next.next指下个节点
    while(prev.next && prev.next.next) {
        if (prev.next.val === prev.next.next.val) {
            // 标记,待会儿删除当前节点
            isDup = true;
            // 删除下个节点
            prev.next.next = prev.next.next.next;
        } else {
            // 判断是否需要删除当前节点
            if (isDup) {
                prev.next = prev.next.next;
                isDup = false;
            } else {
                prev =  prev.next;
            }
        }
    }

    // 循环结束, 判断是否有需要删除当前节点
    if (isDup) {
        prev.next = null;
    }

    return result.next;
};
复制代码

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。

扫描二维码关注公众号,回复: 13370571 查看本文章

猜你喜欢

转载自juejin.im/post/7034499373400752159