删除排序链表中的重复元素
题目描述:
解题思路:
- 第一种:这个方法也是比较好想的。跟之前的链表题类似,一开始要先对
head
链表进行检验是否为空,或者说只有一个元素。其次,只要链表中有不止一个元素,就对p.val
和p.next.val
比较,如果相同,则删除重复项,也就是p.next
的起点从p.next.next
开始。如果不相同,则就继续往下比较。最后返回去重后的head
。 - 时间复杂度:O(m)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
p = head
if p == None or p.next == None:
return head
while p.next:
if p.val == p.next.val:
p.next = p.next.next
else:
p = p.next
return head
- 第二种:这里用到了递归的方法,先是判断
head
是否为空,然后如果head.next
存在且当前的节点和下一个节点相同,则我们用head = head.next
来跳过这个重复的节点,然后继续递归,反之,如果不相同,就直接继续用head.next
递归。 - 时间复杂度为:O(n)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head:
return head
if head.next and head.val == head.next.val:
while head.next != None and head.val == head.next.val:
head = head.next
return self.deleteDuplicates(head)
else:
head.next = self.deleteDuplicates(head.next)
return head
- 或者这样写,思路是一样的,如果当前节点和下一个节点的值相同,则返回第二个节点,并且在每个递归中将下一个递归结果连接到当前节点。
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if head:
head.next = self.deleteDuplicates(head.next)
if head.next and head.val == head.next.val:
return head.next
else:
return head
# return head.next if head.next and head.val == head.next.val else head
- 第三种:这个方法类似第一种,开始的判断就先不说了,主要是后面的去重方法很有意思。这里将链表
head
赋给了新定义的两个链表A
和B
。然后我们通过比较A
和B
的节点是否相同,相同的话就把链表B
往后进一个节点又继续比较,不相同就A
往后进一个节点,并且把B
后面的元素给到A
的后面,这个细节可以通过在草稿纸上画画,比较容易理解。最后通过一系列比较代换,最后就只剩下不重复的元素了。 - 时间复杂度:O(n)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def deleteDuplicates(self, head: ListNode)-> ListNode:
if not (head and head.next):
return head
A,B = head,head
while B:
if A.val!=B.val:
A = A.next
A.val = B.val
B = B.next
A.next = None
return head
或者像下面这个代码这样也可以。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if head is None:
return head
A = head.next
p = head
while A is not None:
if A.val == p.val:
p.next = A.next
A = A.next
else:
p = p.next
A = A.next
return head