31. Leetcode 82. 删除排序链表中的重复元素 II (链表-双指针)

本文介绍了一种使用双指针技巧来删除链表中重复节点的方法。通过定义两个指针a和b,实现只保留链表中不重复的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个已排序的链表的头 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值