难度:中等
题目描述:
思路总结:这个题虽然是一个中等题,但是包括的内容比较丰富。第一种解法是利用了快慢指针的思想,第二种递归解法我至今还没搞懂,需要下一步的着重理解。
题解一:
# 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:
#思路:这题的重点还是有序链表,复杂地方还是在于找到要删除的节点的pre结点
if not head:
return head
hh = ListNode(0)
hh.next = head
fast, slow = head, hh
while fast:
if fast.next and fast.val == fast.next.val: #重要,与后面没重复的情况进行区分。直到第一次出现当前fast与下一个元素不重复的情况
tmp = fast.val
while fast and tmp == fast.val: #也很重要,与fast.val判断保证了while循环过后fast指针在重复区域的外面
fast = fast.next
else:
slow.next = fast
slow = slow.next
fast = slow.next
slow.next = fast #用例[1,1]。排除从开始就是重复结点的情况
return hh.next
题解一结果:
题解二:
# 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 and head.val == head.next.val:
head = head.next
return self.deleteDuplicates(head.next)
else:
head.next = self.deleteDuplicates(head.next)
return head
题解二结果: