给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3]
输出:[2,3]
这里我们使用双指针的方式,定义a,b两个指针。 如果a指向的值不等于b指向的值,则两个指针都前进一位
否则,就单独移动b,b不断往前走,直到a指向的值不等于b指向的值。
注意,这里不是直接比较a.val==b.val,这么比较不对,因为初始的时候,a指向的 是dummy head结点,所以比较逻辑应该是这样:
a.next.val == b.next.val 当两个指针指向的值相等时,b不断往前移动,这里是通过一个while循环判断的, 因为要过滤掉1->2->2->2->3重复的2。
# 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 not (head and head.next):
return head
dummpy = ListNode(0)
dummpy.next = head
a = dummpy
b = head
while b and b.next:
if a.next.val != b.next.val:
a = a.next
b = b.next
else:
while b and b.next and a.next.val == b.next.val:
b = b.next
a.next = b.next
b = b.next
return dummpy.next