【LeetCode】删除排序链表中的重复元素 II

#LeetCode每日一题【链表专题】

  • 删除排序链表中的重复元素 II
    https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/

  • 分析
    两种实现方式:迭代+递归
    迭代:双指针
    正常思路双指针:遇到一样的慢指针留下来作为标记,快指针向前走;
    遇到不一样的,处理:将慢指针的上一个的next置为fast;;所以这里关键的要找到slow的上一个,巧妙的办法就是使用一个哑节点
    使用第三个指针,初始时指向哑节点,然后随着slow前进,保持着在slow的前面一个;

    大体流程如上面所示,主要在最后需要处理下慢指针是否在最后一个的情况,在最后一个即末尾都不相同,不在最后一个即末尾都相同则需要特殊处理下

  • 实现

public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode tempNodeBegin = new ListNode(0, null);
        // 加一个哑节点
        tempNodeBegin.next = head;
        ListNode slow = head, fast = head, slowTemp = tempNodeBegin;
        while (fast != null) {
            // 值相等,fast前进,slow留下来标记
            if (slow.val != fast.val) {
                // 不是紧挨着的
                if (slow.next != fast) {
                    slowTemp.next = fast;
                    slow = fast;
                } else {
                    slowTemp = slowTemp.next;
                    slow = slow.next;
                }
            }
            fast = fast.next;
        }
        // slow与fast不紧挨着(即末尾都是一样的数)
        if (slow.next != null) {
            slowTemp.next = null;
        }
        return tempNodeBegin.next;
    }

LeetCode耗时:0ms
在这里插入图片描述

  • 实现二:递归
    借鉴别人写的递归
/*
    递归处理方式
     */
    public ListNode deleteDuplicates02(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode next = head.next;
        if (head.val == next.val) {
            // 一直向下寻找,直到遇到不相等的val
            while (next != null && head.val == next.val) {
                next = next.next;
            }
            head = deleteDuplicates02(next);
        } else {
            ListNode node = deleteDuplicates02(next);
            head.next = node;
        }
        return head;
    }

LeetCode耗时:0ms
在这里插入图片描述

  • 总结
    关于递归:
    递归之前的逻辑处理是为了处理传入的参数
    递归之后的逻辑处理是为了处理最后的结果(有当前和上一步返回的结果)
    递归三部曲:https://lyl0724.github.io/2020/01/25/1/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值