LeetCode ---- 82、删除排序链表中的重复元素 II

题目链接

思路一:

遍历链表,使用一个map来记录每个节点值出现的次数

再次遍历链表,若当前节点的值只出现了一次,那么就进行保留,否则跳过

    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        HashMap<Integer, Integer> map = new HashMap<>();
        ListNode cur = head;
        while (cur != null) {
            // 之前未出现过该值
            if (!map.containsKey(cur.val)) {
                map.put(cur.val, 1);
            } else { // 之前出现过该值
                map.put(cur.val, map.get(cur.val) + 1);
            }
            cur = cur.next;
        }
        cur = head;
        ListNode newHead = null;
        ListNode last = null;
        while (cur != null) {
            // 当前节点值只出现了一次
            if (map.get(cur.val) == 1) {
                // 设置新链表的头节点
                newHead = newHead == null ? cur : newHead;
                // 设置新链表的当前尾节点
                last = last == null ? newHead : last;
                // 当前节点不是头节点时,进行连接
                if (newHead != cur) {
                    last.next = cur;
                    last = cur;
                }
            }
            cur = cur.next;
        }
        if (last != null)
            last.next = null;
        return newHead;
    }
    class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }

思路二:

遍历一次链表即可,遇到重复值的节点时,直接跳过,否则拼接

    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        // 新增一个头节点
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode cur = dummy;
        while (cur.next != null && cur.next.next != null) {
            // 此节点的值重复出现时
            if (cur.next.val == cur.next.next.val) {
                ListNode dup = cur.next;
                // 寻找此节点后面第一个不重复的节点
                while (dup != null && dup.next != null && dup.val == dup.next.val) {
                    dup = dup.next;
                }
                // 第一个不重复的节点进行连接
                cur.next = dup.next;
            } else { // 此节点的值只出现了一次,则直接进行连接
                cur = cur.next;
            }
        }
        return dummy.next;
    }

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/107167560