1.题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。
样例1
输入:1->2->3->3->4->4->5 输出:1->2->5
样例2
输入:1->1->1->2->3 输出:2->3
2.解题思路
因为可能会把头节点删掉,所以要插入一个虚拟头节点
利用两个指针扫描,
第一个指针p存的是上一段的结尾节点,初始时即为虚拟头节点
第二个指针q存的是下一段的首节点,q=p.next
while内循环:如果q存在并且q的值和p.next的值相等,那么q就一直向下走,q=q.next,此时q指向的是下下段的头节点
如果下段长度为1:即 if q=p.next.next:p向后一位,p=p.next
否则,else:下一段长度大于1,即要把下一段删掉,那直接让p.next=q即可
外层while循环上述操作,直到q=None,其实无论在if还是在else中更新指针,最后p.next都为q,因此如果q为空了,说明链表遍历结束
最后返回虚拟头节点的next
3.代码实现
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplication(self, pHead):
if not pHead or pHead.next==None:
return pHead
h=ListNode(-1)
h.next=pHead
p=h
q=pHead
while q:
# 先q走
while p.next and q and p.next.val == q.val:
q=q.next
# 再p走,分两种情况
if p.next.next==q:
p=p.next
else:
p.next=q
return h.next