概述
两道题目,都是对排序链表做删除操作
没有什么特别难的地方,就是考察代码能力和链表操作
题目
- 删除排序链表中的重复元素
- 删除排序链表中的重复元素 II
删除排序链表中的重复元素
朴素迭代:
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head:
return head
p = head
while p.next:
# 值相等 跳过
if p.next.val == p.val:
p.next = p.next.next
else:
p = p.next
return head
递归:
这里递归是最后处理当前相邻节点的关系,如果先处理的话,碰到[1,1,1]
这种组合不好编码
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
# 无结点或仅有一个结点的情况
if not head or not head.next:
return head
# 先处理后续的链表
head.next = self.deleteDuplicates(head.next)
# 发现相邻结点相同
if head.val == head.next.val:
head.next = head.next.next
return head
快慢指针:
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
# 无结点或仅有一个结点的情况
if not head or not head.next:
return head
slow,fast = head,head
while fast:
if slow.val == fast.val: # 相等,快指针后移
fast = fast.next
else: # 不相等,更新slow指针
slow.next = fast
slow = fast
# 特殊情况处理,末尾是连续的重复值
slow.next = None
return head
删除排序链表中的重复元素 II
朴素迭代:
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
dh = ListNode(None)
dh.next = head
p = head
pre = dh # p的前一个节点
while p:
# 遍历相同的结点
t = p
while t.next and t.next.val == p.val:
t = t.next
if t == p:
# 无重复值,更新pre,p往后移动
pre.next = p
pre = p
p=p.next
else:
# 有重复值,pre保持不变,p更新为t
t = t.next
pre.next = t
p = t
return dh.next
递归:
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
next = head.next
# 相邻重复
if head.val == next.val:
# 跳过重复结点
while next and head.val == next.val:
next = next.next
# 处理以next开始的链表
head = self.deleteDuplicates(next)
else:
head.next = self.deleteDuplicates(next)
return head