存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

示例 1:

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:

输入:head = [1,1,1,2,3]
输出:[2,3]

提示:

链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

//假设使用额外的空间O(n),使用map记录每个节点的val出现的次数,达到一个统计的目的

public ListNode deleteDuplicates(ListNode head) {

        //使用map key = 具体值,value = 出现的次数
Map<Integer,Integer> map = new HashMap<>();
ListNode current = head; while(current != null){
map.put(current.val,map.getOrDefault(current.val,0)+1);
current = current.next;
} ListNode result = new ListNode();
current = result;
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
if(entry.getValue() == 1){
ListNode temp= new ListNode(entry.getKey());
current.next = temp;
current = current.next;
}
}
return result.next;
}

结果测试用例是跑不通的了,原因很明显:最后使用map遍历,打乱了链表之前的顺序

//那么就不再使用map遍历了,而是使用链表遍历

public ListNode deleteDuplicates(ListNode head) {

        //使用map key = 具体值,value = 出现的次数
Map<Integer,Integer> map = new HashMap<>();
ListNode current = head; while(current != null){
map.put(current.val,map.getOrDefault(current.val,0)+1);
current = current.next;
} ListNode result = new ListNode(0);
current = result;
while(head != null){
if(map.get(head.val) == 1){
current.next = new ListNode(head.val);
current = current.next;
}
head = head.next;
}
return result.next;
}

这个当然测试用例是ok的,不过同样也存在问题,题目中明显的告诉我们是有序链表,我们这种方式并没有很好地应用到有序链表的特性,所以使用了额外的空间,目前时间复杂度为O(n) 空间复杂度为O(n)

//那就再考虑下怎么不使用额外的空间

其实也比较好想:

public ListNode deleteDuplicates(ListNode head) {

        //这里您就问了,这是什么节点呢?
//这是一个哑节点,没有存储数字的含义,作用就是:能够指向最终的结果。
ListNode dummyNode = new ListNode(0);
dummyNode.next = head; ListNode current = dummyNode; while(current.next != null && current.next.next != null){ //如果说当前节点的下一个跟下一个的下一个值相等,则把下一个下一个都移除
if(current.next.val == current.next.next.val){ //看到了吧,把当前值拿出来
int x = current.next.val; //然后在这个循环里,删除current.next的值,如果等于x
while(current.next != null && current.next.val == x){
current.next = current.next.next;
}
} else {
current = current.next;
}
} return dummyNode.next; }

时间复杂度为O(n)、空间复杂度为O(1)

【力扣】82. 删除排序链表中的重复元素 II的更多相关文章

  1. LeetCode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)

    82. 删除排序链表中的重复元素 II 82. Remove Duplicates from Sorted List II 题目描述 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有 ...

  2. Java实现 LeetCode 82 删除排序链表中的重复元素 II(二)

    82. 删除排序链表中的重复元素 II 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4- ...

  3. leetcode 83. 删除排序链表中的重复元素 及 82. 删除排序链表中的重复元素 II

    83. 删除排序链表中的重复元素 问题描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: ...

  4. [LeetCode] 82. 删除排序链表中的重复元素 II

    题目链接 : https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ 题目描述: 给定一个排序链表,删除所有含有 ...

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

    # 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字,比如: # 输入: 1->2->3->3->4->4->5 # 输出: 1 ...

  6. LeetCode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)

    题目描述 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5 输出: ...

  7. leetcode刷题-82.删除排序链表中的重复元素 II

    题目 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5输出: 1- ...

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

    1. 题目 2. 解答 新建一个链表,并添加一个哨兵结点,从前向后开始遍历链表. 如果下一个结点的值和当前结点的值相等,则循环向后遍历直到找到一个和当前结点值不相等的结点: 反之,如果下一个结点的值和 ...

  9. 力扣(LeetCode)删除排序链表中的重复元素II 个人题解

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...

随机推荐

  1. 【Docker】Asp.net core在docker容器中的端口问题

    还记得[One by one系列]一步步学习docker(三)--实战部署dotnetcore中遇到的问题么?容器内部启动始终是80端口,并不由命令左右. docker run --name cont ...

  2. [啃书] 第1篇 - 输入输出/变量类型/math函数

    啃书部分已单独做成Gitbook了,后续不再更新.详情访问个人网站ccoding.cn或ccbyte.github.io 说在前面 一直想刷算法找不到很适合的书,后来发现考PAT很多推荐<算法笔 ...

  3. 我罗斯方块最终篇(Player类、Game类)

    我罗斯方块最终篇(Player类.Game类) |--------------------项目GitHub地址--------------------| 目录 我罗斯方块最终篇(Player类.Gam ...

  4. Ubuntu加速訪問GitHub

    Github一般用于Git的远程仓库,由于服务器位于国外,国内访问速度比较慢,为了提高访问速度,决定绕过DNS域名解析. 获取Github的IP地址 按下ctrl+alt+T打开命令终端,输入: ns ...

  5. [nowcoder5668J]Operating on the Tree

    考虑令$a_{i}$为i的位置,$p_{i}=0/1$表示第i个点的贡献,那么$p_{x}=0$当且仅当存在与其相邻的点$y$满足$a_{y}<a_{x}$且$p_{y}=1$ 树形dp,定义状 ...

  6. [JS高程] 字符串模式匹配方法

    目录 1. RegExp 对象 2. 字符串模式匹配方法 2.1 match() , search() 2.2 replace() 2.2.1 第二个参数为字符串的应用情况 2.2.2 第二个参数为函 ...

  7. watch异步操作

    异步操作: 1.ajax, 2.定时器 3.点击事件 4.数据库操作 特点:代码不等待,后续代码会继续执行. watch:{ //watch作用监测已经存在的数据 newVal 新值,oldVal 旧 ...

  8. javascript-初级-day02-this关键字

    day01-获取元素的第二种方法 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-T ...

  9. python 内置模块续(二)

    目录 python 内置模块补充 1.hashlib模块 简易使用: 高级使用: 进阶使用: 加盐处理: 校验文件一致性 2.logging日志模块 日志等级 常用处理 "四大天王" ...

  10. 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)

    洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...