分类:链表
难度:medium
方法:双指针
- 删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
题解
我的思路是双指针
首先设置一个新节点res,和一个遍历的指针pos
使用快慢两个指针cur1,cur2分别指向头部节点和头部节点的下一个
初始化状态:
(1)cur1,cur2的值如果不同,则显然cur1是非重复的,pos指向cur1,所有指针向前前进一格
(2)如果cur1,cur2的值相同,则当前cur1的节点为重复节点,不断后移cur2,直到找到一个值不同的新节点,重新将cur1指向新节点,cur2指向它的next
不断循环上述判断
结束条件:
最后别忘了,如果cur1指向的是非空节点,要加入返回的链表中,然后指向空,结束
如果cur1指向空节点,则直接指向空节点,结束
代码
# Definition for singly-linked list.
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
class Solution(object):
def deleteDuplicates(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
cur1,cur2 =head,head.next
pos = res = ListNode(-1)
while cur1 and cur2:
# print(cur1.val,cur2.val)
if cur1.val != cur2.val:
pos.next = cur1
# print(pos.val)
# print(pos.next.val)
pos = pos.next
cur1 = cur1.next
cur2 = cur2.next
if cur1 and cur2 and cur2.val==cur1.val:
while cur2 and cur2.val==cur1.val:
cur2 = cur2.next
cur1 = cur2
# print(cur2.val)
if cur2:
cur2 = cur2.next
if cur1 and not cur2:
pos.next = cur1
pos = pos.next
pos.next=None
return res.next
代码越来越乱额