删除排序链表中的重复数字 II
来源:互联网 发布:电信路由器 21端口 编辑:程序博客网 时间:2024/05/16 07:58
题目描述:给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。
样例:给出 1->2->3->3->4->4->5->null,返回 1->2->5->null;给出 1->1->1->2->3->null,返回 2->3->null
还记得之前做过一道删除链表中重复元素的题(详见:点击打开链接),那道题中,我用了一个集合来存储出现过的元素,从而在遍历链表过程中决定节点的去留。但是这道题不适用这种方法了,因为只要出现重复就全部删掉。如果还用集合的方法,只能遍历两遍,这显然不够高效。好在这道题还给了另外一个条件:那就是这个链表是排好序的。所以,我们也没必要用一个集合了,直接用一个数存储可能重复的值即可。
具体的思路是这样的:记录第一个节点的值,然后循环,找出所有重复的节点(找的原则就是看此后的节点的值和刚才记录的值是否相等),如果只有一个节点满足相等的条件(就是说明不重复,只有一个节点含有这个值),就继续记录下一个节点的值;如果不止一个节点满足条件(说明含有这个值的节点有重复),那就全部删除,记录删完之后的第一个节点的值。
依照上面的思路遍历链表,直到全部处理完。
代码如下:
"""Definition of ListNodeclass ListNode(object): def __init__(self, val, next=None): self.val = val self.next = next"""class Solution: """ @param head: A ListNode @return: A ListNode """ def deleteDuplicates(self, head): if head is None: return head dummy = ListNode(-1) dummy.next = head pre = dummy cur = head # 从头结点开始遍历 while cur: # 计数 count = 0 # 记录用于对比的值 temp = cur.val # 循环至少进行一次,count值至少为1 # 进行完之后,cur指向的是下一个值不同节点,或者空 while cur and cur.val == temp: count += 1 cur = cur.next # 有重复,直接删除 if count > 1: pre.next = cur # 无重复,将pre前移 else: pre = pre.next return dummy.next # write your code here
0 0
- LintCode-删除排序链表中的重复数字 II
- 删除排序链表中的重复数字 II
- 题目:删除排序链表中的重复数字 II
- lintcode-删除排序链表中的重复数字II-113
- 删除排序链表中的重复数字 II
- 删除排序链表中的重复数字 II
- 删除排序链表中的重复数字 II
- lintcode-删除排序链表中的重复数字 II
- LintCode(M)删除排序链表中的重复数字 II
- lintcode,删除排序链表中的重复数字 II
- LintCode 删除排序链表中的重复数字 II
- 删除排序链表中的重复数字 II -LintCode
- 删除排序链表中的重复数字 II -LintCode
- [LintCode]113.删除排序链表中的重复数字 II
- LintCode删除排序链表中的重复数字 II
- 删除排序数组中的重复数字 II
- 删除排序数组中的重复数字 II
- 删除排序数组中的重复数字 II
- springMVC(10)------重定向处理
- mysql读写分离
- 单链表的基本操作
- C语言学习笔记
- 六、树和二叉树--(2)二叉树的先序遍历、中序遍历、后序遍历
- 删除排序链表中的重复数字 II
- android基本架构
- git的使用
- [CSDN_Markdown] Markdown基本语法
- gem install 失败
- ActiveMQ小记(二):基于ZooKeeper的HA方案
- c++primer第二遍阅读感悟(chap2)
- 代码优化
- SDK内容