AC牛客 BM16 删除有序链表中重复的元素-II

简介: AC牛客 BM16 删除有序链表中重复的元素-II

BM16 删除有序链表中重复的元素-II

题目描述

描述

给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5.
给出的链表为1→1→1→2→3, 返回2→3.

数据范围:链表长度0≤n≤10000,链表中的值满足∣val∣≤1000
要求:空间复杂度O(n),时间复杂度O(n)
进阶:空间复杂度 O(1),时间复杂度O(n)

示例1

输入:
{1,2,2}
返回值:
{1}

示例2

输入:
{}
返回值:
{}

解题思路

解法1 Treemap

1.使用Treemap统计每个数字出现的次数
2.遍历map,找出其中出现一次的数字,然后构造新的Node节点,返回即可

解法2 空间复杂度为O(1)的解法

1.使用一个哑结点,将哑结点与head串联
2.pre节点指向哑结点,cur节点指向头节点,开始遍历
3.解答此题的关键在于,找到不重复的节点,然后将pre.next指向这个节点即可

实践代码

解法 1 代码

import java.util.*;
import java.util.Map.Entry;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head
     *            ListNode类
     * @return ListNode类
     */
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        TreeMap<Integer, Integer> map = new TreeMap<>();
        while (head != null) {
            map.put(head.val, map.getOrDefault(head.val, 0) + 1);
            head = head.next;
        }

        ListNode temp = new ListNode(-1);
        head = temp;
        Iterator<Entry<Integer, Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Entry<Integer, Integer> entry = iterator.next();
            if (entry.getValue() == 1) {
                temp.next = new ListNode(entry.getKey());
                temp = temp.next;
            }
        }
        
        return head.next;
    }
}

解法2 代码

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head
     *            ListNode类
     * @return ListNode类
     */
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode dump = new ListNode(-1);
        dump.next = head;
        ListNode pre = dump;
        ListNode cur = head;
        while (cur != null && cur.next != null) {
            if (cur.val == cur.next.val) {
                ListNode temp = cur.next;
                while (temp != null && temp.val == cur.val) {
                    temp = temp.next;
                }
                pre.next = temp;
                cur = temp;
            } else {
                pre = pre.next;
                cur = cur.next;
            }
        }
        return dump.next;
    }
}
目录
相关文章
|
1月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
36 1
|
1月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
50 0
Leetcode第21题(合并两个有序链表)
|
1月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
93 0
|
3月前
|
Python
【Leetcode刷题Python】21. 合并两个有序链表
介绍了几种不同的方法来合并多个已排序的链表,包括暴力求解、使用小顶堆以及分而治之策略。
42 2
|
3月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
5月前
|
存储 算法 C语言
【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
01_移除链表元素
01_移除链表元素
|
1月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
30 0
|
3月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
3月前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表