82. 删除排序链表中的重复元素 II
问题描述
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
![](https://i-blog.csdnimg.cn/blog_migrate/bb883772e38c3e83b2a9102f6ed2ffa1.png)
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
![](https://i-blog.csdnimg.cn/blog_migrate/c309eb8f5a99706d99d8cce534af9a8d.png)
输入:head = [1,1,1,2,3]
输出:[2,3]
提示:
- 链表中节点数目在范围 [0, 300] 内
- -100 <= Node.val <= 100
- 题目数据保证链表已经 按升序排列
思路&代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if head == None or head.next == None:
return head
# 由于链表头可能是重复元素,可能把 head 也删掉,这里定义一个新的链表头接在 head 前面
# 返回时只需要返回new_head.next即可
new_head = ListNode(0, head)
q = new_head # 用来形成 “新” 链表
p1 = head # 用来判断是否为重复元素,永远指向每种数字的第一个
p2 = head.next # 用来遍历
while p2:
if p1.next.val != p1.val: # 该元素不重复
q.next = p1
q = q.next
p1 = p1.next
p2 = p1.next
else: # 这里的工作是把p2和p1移向新的数字
while p2 and p2.val == p1.val:
p2 = p2.next
if p2 == None: # 这里是判断是否到了最后一个元素,并且最后的元素是重复的
# 如 [1,2,3,3,4,4] 到最后的 4 时就是这种情况
q.next = None
break
p1 = p2
p2 = p1.next
if p2 == None: # 这里是将p2指向新的元素了,并且是最后一个元素且不重复
# 如 [1,2,3,3,4,4,5] 到最后的 5 时就是这种情况
q.next = p1
return new_head.next