题解 | #删除有序链表中重复的元素-II#

删除有序链表中重复的元素-II

http://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024

更多题解,请关注公众号:程序员学长,让你进大厂不走弯路

删除有序链表中重复的元素-II

问题描述

LeetCode 82. 删除排序链表中的重复元素 II

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。返回同样按升序排列的结果链表。

示例:

输入:head = [1,2,3,3,4,5]

输出:[1,2,5]

image-20211022172733256

分析问题

由于给定的链表是有序的,所以链表中重复的元素在位置上肯定是相邻的。因此,我们可以对链表进行一次遍历,就可以删除重复的元素。

这里需要注意一点,由于可能会删除头结点head,我们引入了一个哨兵节点dummy,让dummy.next=head,这样即使head被删除了,那么也会操作dummy.next指向新的链表头结点,所以最终返回dummy.next即可。

首先,我们让cur指针指向链表的哨兵节点,然后开始对链表进行遍历。如果cur.next与cur.next.next对应的元素值相同,那么我们就需要将cur.next以及后面所有值相同的链表节点全部删除,直到cur.next为空节点或者其元素值与其不同。如果cur.next与cur.next.next对应的元素值不相同,那么我们就可以将cur 指向 cur.next。

image-20211022233832513

image-20211022233935213

下面我们来看一下代码的实现。

class Solution:
    def deleteDuplicates(self, head):
        #如果链表为空,直接返回
        if not head:
            return head
        #创建一个哨兵节点
        dummy = ListNode(0)
        dummy.next=head

        #开始时,将cur指向哨兵节点
        cur = dummy
        while cur.next and cur.next.next:
            #如果cur.next.val和cur.next.next.val相同,删除重复元素
            if cur.next.val == cur.next.next.val:
                data = cur.next.val
                while cur.next and cur.next.val == data:
                    cur.next = cur.next.next
            else:
                cur = cur.next

        return dummy.next

该算法的时间复杂度是O(n),空间复杂度是O(1)。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务