删除排序链表中的重复元素
难度:简单
给定一个已排序的链表的头 head ,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
解法一、迭代
思路: 迭代更新链表,每次判断当前节点值和下一个节点值是否相同,如果相同就让当前节点指向下下个节点,如果不相等就迭代到当前节点的下一个节点,直到当前节点为空,则迭代结束。
时间复杂度:
O
(
n
)
O(n)
O(n),所有节点都遍历一遍。
空间复杂度:
O
(
1
)
O(1)
O(1)
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
node = head
while node:
if node.next and node.val == node.next.val:
node.next = node.next.next
else:
node = node.next
return head
解法二、递归
思路: 由迭代解法可以发现,每次迭代处理的子问题都是相同的,所以可以转换为递归的方法:
- 结束条件:判断当前节点或者当前节点的下一个节点是否为空,若为空则返回该节点。
- 迭代语句:更新当前节点的下一个节点为下一个节点的递归返回结果。
- 递归返回语句:如果当前值和下一个节点的值相同,就返回当前节点的下一个节点,否则返回当前节点。
时间复杂度:
O
(
n
)
O(n)
O(n),所有节点都遍历一遍。
空间复杂度:
O
(
n
)
O(n)
O(n),递归入栈。
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
if head is None or head.next is None:
return head
head.next = self.deleteDuplicates(head.next)
return head.next if head.val == head.next.val else head
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list