删除排序链表中重复元素

概述

两道题目,都是对排序链表做删除操作
没有什么特别难的地方,就是考察代码能力和链表操作

题目

  1. 删除排序链表中的重复元素
  2. 删除排序链表中的重复元素 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

猜你喜欢

转载自blog.csdn.net/hhmy77/article/details/115211200