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

发布时间:2024年01月15日

题目链接

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

文章来源:https://blog.csdn.net/weixin_53908842/article/details/135609763
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。