82. 删除排序链表中的重复元素 II|刷题打卡

89 阅读1分钟

思路:

  • 考虑 1->2->3->4->4->4->5->5->6->7
  • 关键在于要把重复元素删干净。
    • 没有遇到重复的,pre cur往后走
    • 遇到重复的,pre不动,cur往后走,cur.next.val != cur.val处停止。
    • 容易犯的错是:只考虑了两个重复,第三个重复就留下来了。
  • if while的排放可以优化,下面是两版代码。

第四

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy = new ListNode();
        dummy.next = head;
        ListNode pre = dummy, cur = head;
        while (cur != null) {
            if (cur.next != null && cur.val == cur.next.val) {//重复时
                // 注意1,3,3,3,3的情况
                while (cur.next != null && cur.val == cur.next.val) {//跳到不重复为止
                    cur = cur.next;
                }
                cur = cur.next;
                pre.next = cur;
            } else { //不重复时
                cur = cur.next;
                pre = pre.next;
            }
        }
        return dummy.next;
    }
}

第三版

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy = new ListNode();
        dummy.next = head;
        ListNode pre = dummy, cur = head;
        while (cur != null && cur.next != null) {
            if (cur.val != cur.next.val) {//不重复时
                pre = cur;
                cur = pre.next;
            } else {//重复时
                while (cur.next != null && cur.val == cur.next.val) {
                    cur.next = cur.next.next;
                }
                cur = cur.next;
                pre.next = cur;
            }
        }
        return dummy.next;

    }
}

第二版

先用if判断不重复,更简洁

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy = new ListNode();
        dummy.next = head;
        ListNode cur = head, pre = dummy;
        while (cur != null && cur.next != null) {
            if (cur.val != cur.next.val) {//不重复时
                pre = cur;
                cur = cur.next;
            } else {
                while (cur.next != null && cur.val == cur.next.val) {//当遇到重复,把cur移到重复区域的最后一个节点
                    cur = cur.next;
                }
                pre.next = cur.next;//由于dup,把cur往后再挪一位,到不重复的新开始节点
                cur = cur.next;
            }
        }
        return dummy.next;
    }
}

第一版

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy = new ListNode();
        dummy.next = head;
        ListNode cur = head, pre = dummy;
        while (cur != null) {
            boolean dup = false;//重复吗
            //当遇到重复,把cur移到重复区域的最后一个节点
            while (cur.next != null && cur.val == cur.next.val) {
                cur = cur.next;
                dup = true;
            }
            if (dup) {
                cur = cur.next;//由于dup,把cur往后再挪一位,到不重复的新开始节点
                pre.next = cur;//连过来
            } else {//不重复,直接过
                pre = cur;
                cur = cur.next;
            }
        }
        
        return dummy.next;
    }
}