leetcode-82删除排序链表中的重复元素

题目链接

82. 删除排序链表中的重复元素 II - 力扣(LeetCode)

解题思路

题意:在一个有序链表中,如果一个节点的值出现不止一次,那么把所有等于此值的节点删除掉。

重点:有序链表,所以,一个节点的值不止一次出现,那他们必定相邻。

递归

deleteDuplicates(head)即删除head作为开头的有序链表,值出现重复的节点。

递归终止条件

  • 如果head为空,那么肯定没有值出现重复的节点,直接返回head;
  • 如果head.next为空,那么说明链表中只有一个节点,也没有值出现重复的节点,也直接返回head。

递归调用

什么时候需要递归?

  • 如果head.val != head.next.val,说明头节点的值不等于下一个结点的值,所以当前的head节点必须保留;但是head.next节点要不要保留呢?我们还不知道,需要对head.next进行递归,即对head.next进行递归,即对head.next作为头节点的链表,去除值重复的节点。所以head.next = deleteDuplicates(head.next)
  • 如果head.val == head.next.val,说明头节点的值等于下一个节点的值,所以当前的head节点必须删除,并且head之后所有与head.val相等的节点都需要删除;删除到哪个节点为止呢?需要用move指针一直向后遍历寻找与head.val不等的节点。此时move节点之前的节点都不保留了,因此返回deleteDuplicates(move)

代码

# 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: Optional[ListNode]) -> Optional[ListNode]:
        if not head or not head.next:
            return head
        if head.val != head.next.val:
            head.next = self.deleteDuplicates(head.next)
        else:
            move =  head.next
            while move and head.val == move.val:
                move = move.next
            return self.deleteDuplicates(move)
        return head

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值