LeetCode 算法题库【83】——删除排序链表中的重复元素

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

题目描述:

timu

解题思路:
  • 第一种:这个方法也是比较好想的。跟之前的链表题类似,一开始要先对head链表进行检验是否为空,或者说只有一个元素。其次,只要链表中有不止一个元素,就对p.valp.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

1

  • 第二种:这里用到了递归的方法,先是判断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

2

  • 第三种:这个方法类似第一种,开始的判断就先不说了,主要是后面的去重方法很有意思。这里将链表head赋给了新定义的两个链表AB。然后我们通过比较AB的节点是否相同,相同的话就把链表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

3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值