更多算法常识,请关注公众号《程序员学长》
删除有序链表中反复的元素-II
问题形容
LeetCode 82. 删除排序链表中的反复元素 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)。