82. Remove Duplicates from Sorted List II

题目描述和难度

  • 题目描述:

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3

思路分析

求解关键:分析清楚各种可能出现的情况,其实代码并不难写,我把思路都作为注释写在代码中了。

参考解答

参考解答1

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }

    public ListNode(int[] nums) {
        if (nums == null || nums.length == 0) {
            throw new IllegalArgumentException("arr can not be empty");
        }
        this.val = nums[0];
        ListNode curr = this;
        for (int i = 1; i < nums.length; i++) {
            curr.next = new ListNode(nums[i]);
            curr = curr.next;
        }
    }

    @Override
    public String toString() {
        StringBuilder s = new StringBuilder();
        ListNode cur = this;
        while (cur != null) {
            s.append(cur.val + " -> ");
            cur = cur.next;
        }
        s.append("NULL");
        return s.toString();
    }
}

public class Solution {

    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return null;
        }

        // 这里我们要清楚,例如 1 1 2 3 ,头结点也是有可能被删除的,所以要设置虚拟头结点
        // 只要涉及头结点的操作,我们都设立虚拟头结点
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;

        ListNode curNode = dummyNode;
        // 题目要求的删除结点这个操作是站在被删除结点前面的
        // 所以循环可以继续的条件应该这样写
        while (curNode.next != null && curNode.next.next != null) {
            // 如果接连两个结点的 val 相等,至少要把它们都删掉
            if (curNode.next.val == curNode.next.next.val) {
                // 要删除的起点至少应该是当前判断相同的结点的第 2 个
                ListNode delNode = curNode.next.next;

                // 如果后面还有相同的结点,delNode 后移一位,即 delNode 应该是指向相同的结点的最后一个
                // 注意:这里得用循环,例如: 1 2 2 2 2 2 2 2 2 3 3 3
                // 得让 delNode 结点挪到最后一个 2 上
                while (delNode.next != null && delNode.next.val == delNode.val) {
                    delNode = delNode.next;
                }

                // 接下来把有重复的链表段删除就可以了
                // 1        2   2   2         3
                // curNode          delNode
                curNode.next = delNode.next;
                delNode.next = null;
            } else {
                // 否则向前走一步
                curNode = curNode.next;
            }
        }
        return dummyNode.next;
    }

    public static void main(String[] args) {
        int[] nums = {1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 8, 9};
        ListNode head = new ListNode(nums);
        Solution solution = new Solution();
        ListNode deleteDuplicates = solution.deleteDuplicates(head);
        System.out.println(deleteDuplicates);
    }
}

本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0082-remove-duplicates-from-sorted-list-ii ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com