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

迭代

class Solution {
    public ListNode deleteDuplicates(ListNode head) {

        /**
         * 节点数小于2不用去重
         */
        if (head == null || head.next == null){
            return head;
        }

        /**
         * 从虚拟头节点开始遍历
         */
        ListNode dummyHead = new ListNode(0, head);
        ListNode prev = dummyHead;
        int delete;

        /**
         * 如果后面两个节点相等,就记录下这个值,然后prev.next指针后移直到不等于这个值
         */
        while (prev.next != null && prev.next.next != null){

            if (prev.next.next.val == prev.next.val){

                delete = prev.next.val;

                /**
                 * 如果找到了不同值的prev.next,prev指针不用再后移,继续进行下一个值的判断
                 */
                while (prev.next != null && prev.next.val == delete){
                    prev.next = prev.next.next;
                }
            }
            else {
                prev = prev.next;
            }
        }

        return dummyHead.next;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

递归

class Solution {
    public ListNode deleteDuplicates(ListNode head) {

        /**
         * 终止条件
         * 如果链表为空或者只有一个节点,不用去重
         */
        if (head == null || head.next == null){
            return head;
        }

        ListNode next = deleteDuplicates(head.next);

        /**
         * 假设头节点以外的节点已经完成去重
         * 最后判断头节点是不是重复的元素
         * 因为链表是升序的,如果头节点和下一个节点相等,那这两个节点都要删除
         * 如果不相等,也不能直接认为头节点没有重复,因为有可能和它相等的节点都被删了而只留下它一个,和原链表的第二个节点比较一下就可判断是否是重复的
         */
        if (next != null && head.val == next.val){
            return next.next;
        }
        else {

            if (head.val == head.next.val){
                return next;
            }
            else {

                head.next = next;
                return head;
            }
        }
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/

posted @ 2021-12-16 14:46  振袖秋枫问红叶  阅读(32)  评论(0)    收藏  举报