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

示例 1:

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

示例 2:

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

思路:这个题目和上一个不太一样,因为它不留下重复的元素。我一开始的思路是,先遍历链表,将每个值的个数计算并保存下,再次遍历链表,并将只出现的一次的节点留下来,但是这样遍历两次的思想显然不明智,而且我计数的方式也不太适合,num[p->val]++,如果链表中的值是负数,显然就不行了,这里自然有其他的计数方法(这里不讨论),但是这里先放弃这种做法。

下面直接贴代码,我这里就说下应该注意的点:(1)头结点的变化,如果重复的数字出现在一开始,头结点head是一定要更换的(2)如果整个链表中遍历完都没有找到没有重复的节点,意味着要返回空,这里最后要注意判断(3)对待链表的最后,如果剩下一个没有重复的,要加入链表,因为程序的双指针遍历,条件判断不到

 ListNode* deleteDuplicates(ListNode* head)
{
if(head==NULL || head->next==NULL) return head;
ListNode* p1,*p2,*p3;
p3=NULL;
p1=head;
p2=p1->next;
int num=1,flag=0;
while(p2)
{
if(p2->val==p1->val)
{
num++;
}
else if(p2->val!=p1->val && num>1)
{
p1=p2;
num=1;
}
else
{
if(flag==0)
{
head=p3=p1;
flag=1;
}
else
{
p3->next=p1;
p3=p3->next;
}
p1=p1->next;
}
p2=p2->next;
}
if(p1->next==NULL)
{
if(p3==NULL)
{
head=p3=p1;
}
else
{
p3->next=p1;
p3=p3->next;
}
}
if(p3==NULL) return NULL;
p3->next=NULL;
return head;
}

我觉得自己的上述做法虽然理清了思路,但是还是太繁琐了,所以寻找下大神们简洁的代码实现

ListNode* deleteDuplicates(ListNode* head) {
if(!head)
return nullptr; ListNode* pre=nullptr;
ListNode* cur=head;
while(cur)
{
if(cur->next && cur->next->val==cur->val)
{
int a=cur->val;
while(cur->next && cur->next->val==a)
{
cur=cur->next;
}
if(!pre)
{
head=cur->next;
}
else
{
pre->next=cur->next;
}
}
else
{
pre=cur;
}
cur=cur->next;
}
return head;
}

Leetcode(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] 82. 删除排序链表中的重复元素 II

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. 【力扣】82. 删除排序链表中的重复元素 II

    存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序排列的结果链表. 示例 1: 输入:hea ...

随机推荐

  1. JS实现鼠标移入DIV随机变换颜色

    今天分享一个在 JavaScript中,实现一个鼠标移入可以随机变换颜色,本质就是js的随机数运用. 代码如下: <!DOCTYPE html> <html> <head ...

  2. 手淘架构组最新实践 | iOS基于静态库插桩的⼆进制重排启动优化 抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 编译期插桩

    抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 原创 Leo 字节跳动技术团队 2019-08-09 https://mp.weixin.qq.com/s/Drmmx5JtjG ...

  3. Pulsar Pub/Sub Messaging

    The Apache Software Foundation Announces Apache Pulsar as a Top-Level Project : The Apache Software ...

  4. LOJ10202樱花——数论

    题目描述 原题来自:HackerRank Equations 求不定方程: 1/x+1/y=1/n! 的正整数解 (x,y) 的数目. 输入格式 一个整数 n . 输出格式 一个整数,表示有多少对 ( ...

  5. 五万字长文带你学会Spring

    Sping Spring概念介绍 spring是啥呢,你在斗地主的时候把别人打爆了那叫spring, 你成功的追到了你爱慕已久的女神,人生中的春天来了,那也叫sping 好了别看我老婆了,咱来讲讲啥是 ...

  6. (五)SpringBoot面试题

    SpringBoot面试题 1.Spring Boot 的自动配置是如何实现的? 2.shiro和oauth还有cas他们之间的关系是什么?问下您公司权限是如何设计,还有就是这几个概念的区别. 2.1 ...

  7. Excel三个下拉互斥

    Excel三个下拉互斥 描述:Excel有三个下拉列表,若选择了其中任意一个下拉,其他两个均不可以在选择. 尝试了很多种办法,级联,数据有效性等等,最后都没实现. 老大,最后用VBA实现. 附上代码: ...

  8. Spring Boot项目application.yml文件数据库配置密码加密

    在Spring boot开发中,需要在application.yml文件里配置数据库的连接信息,或者在启动时传入数据库密码,如果不加密,传明文,数据库就直接暴露了,相当于"裸奔"了 ...

  9. void(*p)()和void*p()区别

    void (*p)()是一个指向函数的指针,表示是一个指向函数入口的指地变量,该函数的返回类型是void类型.它的用法可参看下例: 例如:有一返加void值的函数swap,(swap用来交换两个数) ...

  10. Pythonchallenge1过关攻略

    第一关上来是一个电视,上面写着2^38,这就非常关键了,这时候我们已经有了大致思路,再看一眼电视机下面的话确认一下,"Hint: try to change the URL address. ...