更多题解,请关注公众号:程序员学长,让你进大厂不走弯路
删除有序链表中重复的元素-II
问题描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。返回同样按升序排列的结果链表。
示例:
输入:head = [1,2,3,3,4,5]
输出:[1,2,5]
分析问题
由于给定的链表是有序的,所以链表中重复的元素在位置上肯定是相邻的。因此,我们可以对链表进行一次遍历,就可以删除重复的元素。
这里需要注意一点,由于可能会删除头结点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。
下面我们来看一下代码的实现。
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)。