删除排序链表中的重复数字 II

给定一个已排序的链表,删除所有重复的元素,使得每个元素只出现一次。例如,输入1->2->3->3->4->4->5,输出1->2->5。本题不适用使用集合记录出现过的元素,因为需要删除所有重复项。利用链表排序的特点,只需遍历一次链表,记录当前值,并删除所有重复的节点。

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

题目描述:给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。

样例:给出 1->2->3->3->4->4->5->null,返回 1->2->5->null;给出 1->1->1->2->3->null,返回 2->3->null

还记得之前做过一道删除链表中重复元素的题(详见:点击打开链接),那道题中,我用了一个集合来存储出现过的元素,从而在遍历链表过程中决定节点的去留。但是这道题不适用这种方法了,因为只要出现重复就全部删掉。如果还用集合的方法,只能遍历两遍,这显然不够高效。好在这道题还给了另外一个条件:那就是这个链表是排好序的。所以,我们也没必要用一个集合了,直接用一个数存储可能重复的值即可。

具体的思路是这样的:记录第一个节点的值,然后循环,找出所有重复的节点(找的原则就是看此后的节点的值和刚才记录的值是否相等),如果只有一个节点满足相等的条件(就是说明不重复,只有一个节点含有这个值),就继续记录下一个节点的值;如果不止一个节点满足条件(说明含有这个值的节点有重复),那就全部删除,记录删完之后的第一个节点的值。

依照上面的思路遍历链表,直到全部处理完。

代码如下:

"""
Definition of ListNode
class ListNode(object):

    def __init__(self, val, next=None):
        self.val = val
        self.next = next
"""
class Solution:
    """
    @param head: A ListNode
    @return: A ListNode
    """
    def deleteDuplicates(self, head):
        if head is None:
            return head
        dummy = ListNode(-1)
        dummy.next = head
        pre = dummy
        cur = head
        # 从头结点开始遍历
        while cur:

            # 计数
            count = 0

            # 记录用于对比的值
            temp = cur.val

            # 循环至少进行一次,count值至少为1
            # 进行完之后,cur指向的是下一个值不同节点,或者空
            while cur and cur.val == temp:
                count += 1
                cur = cur.next

            # 有重复,直接删除
            if count > 1:
                pre.next = cur
            # 无重复,将pre前移
            else:
                pre = pre.next
        return dummy.next
        # write your code here


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值