【力扣】82. 删除排序链表中的重复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 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的更多相关文章
- LeetCode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
82. 删除排序链表中的重复元素 II 82. Remove Duplicates from Sorted List II 题目描述 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有 ...
- Java实现 LeetCode 82 删除排序链表中的重复元素 II(二)
82. 删除排序链表中的重复元素 II 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4- ...
- leetcode 83. 删除排序链表中的重复元素 及 82. 删除排序链表中的重复元素 II
83. 删除排序链表中的重复元素 问题描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: ...
- [LeetCode] 82. 删除排序链表中的重复元素 II
题目链接 : https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ 题目描述: 给定一个排序链表,删除所有含有 ...
- 82. 删除排序链表中的重复元素 II
# 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字,比如: # 输入: 1->2->3->3->4->4->5 # 输出: 1 ...
- LeetCode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
题目描述 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5 输出: ...
- leetcode刷题-82.删除排序链表中的重复元素 II
题目 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5输出: 1- ...
- LeetCode 82 ——删除排序链表中的重复元素 II
1. 题目 2. 解答 新建一个链表,并添加一个哨兵结点,从前向后开始遍历链表. 如果下一个结点的值和当前结点的值相等,则循环向后遍历直到找到一个和当前结点值不相等的结点: 反之,如果下一个结点的值和 ...
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
随机推荐
- ES6-正则新增(复习+学习)
ES6-正则 昨天,复习了正则的基本知识,今天学习ES6新增的正则的知识,做一个总结笔记,大家可以先看4,5对应的方法然后再从头看,话不多说直接上: 1.RegExp构造函数的区别 2.新增的修饰符 ...
- C# 计算农历日期方法(2021版)
解决问题 旧版农历获取方法报错,会有 到 2021年 m数组越界了 if (LunarData[m] < 4095) 此方法可以解决 主体代码 public static class China ...
- Hadoop集群 增加节点/增加磁盘
在虚拟机中新建一个机器. 设置静态IP 将修改/etc/hosts 192.168.102.10 master 192.168.102.11 slave-1 192.168.102.12 slave- ...
- [atARC121F]Logical Operations on Tree
(特判$n=1$的情况) 当确定权值和操作后,如何判定是否合法-- 考虑一个度为1的节点,对其权值即其对应边的边操作分类讨论: $1\or$,显然只需要最后选择这条边即可,一定合法 $1\and$或$ ...
- [atAGC027D]Modulo Matrix
对网格图黑白染色,在黑色格中填不同的质数,白色格中填相邻黑色格的lcm+1,但这样会超过1e15的上限将网格图划分为两类对角线,每一条对角线选一个质数,然后每一个点就是两条对角线的质数相乘,而白格的值 ...
- Study Blazor .NET(三)组件
翻译自:Study Blazor .NET,转载请注明. 关于组件 blazor中组件的基础结构可以分为以下3部分, //Counter.razor //Directives section @pag ...
- idea文件多行显示
将红色部分取消勾选
- 日程功能模块【从建模到代码实现】UML + JavaFX
结合 uml 所学和 Javafx 从建模到实现一个子功能模块 -- 日程管理.新手上路,类图到代码实现的过程还是很曲折但所幸收获颇丰,记录一下学习心得. 日程功能模块 最后成果 JAVAFX里面没有 ...
- 【CSP2019 D1T2】【括号树】
题面 不再多说,想必大家都看过这个题 思路 我们可以手推几个满足条件的字符串 我们发现在这些字符串里 每个)都与离它最近的(的匹配 所以我们维护树上每个节点到根节点中没用使用过的(的位置(nl[n]) ...
- CF45G
考虑哥德巴赫猜想:一个偶数可以被拆分两个质数. 所以我们考虑如果不是偶数的话,我们拆分成\((2,m-2)\)或者\((3,del(m - 3))\) 如果是偶数的话\(del(m)\),我们直接枚举 ...