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

98 篇文章 1 订阅
83 篇文章 1 订阅


先看83题,再看82题

83题

在这里插入图片描述

思路一

可以利用pre,cur分别保存前一个节点和当前节点,遇到重复的就一直向下走,直到不重复,此时令pre.next指向cur

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        dummy = ListNode(-1)
        pre = dummy
        cur = head
        pre.next = cur
        while cur and cur.next:
            if cur.val == cur.next.val:
                while cur.next and cur.val == cur.next.val:
                    cur = cur.next
                pre.next = cur
                pre = pre.next
                cur = cur.next
            else:
                pre = cur
                cur = cur.next
        return dummy.next

思路二

将头节点保存起来,遇到重复的,直接把pre节点的next指向cur下一个节点的再下一个节点,就相当于删掉了一个重复的节点

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        if not head:
            return head
        tmp = head
        while head and head.next:
            if head.val == head.next.val:
                head.next = head.next.next
            else:
                head =head.next
        return tmp

思路三

递归

  1. 找终止条件:当head指向链表只剩一个元素的时候,自然是不可能重复的,因此return
  2. 该返回什么值:应该返回的自然是已经去重的链表的头节点
  3. 每一步要做什么:宏观上考虑,此时head.next已经指向一个去重的链表了,而根据第二步,我应该返回一个去重的链表的头节点。因此这一步应该做的是判断当前的head和head.next是否相等,如果相等则说明重了,返回head.next,否则返回head

代码

 class Solution {
        public ListNode deleteDuplicates(ListNode head) {
            if(head == null || head.next == null){
                return head;
            }
            head.next = deleteDuplicates(head.next);
            if(head.val == head.next.val) head = head.next;
            return head;
        }
    }

82题

在这里插入图片描述

思路一

这一题是除了重复的元素要删掉外,重复的元素本身也要删掉,那么与83题思路一不同的是,在遇到重复节点的时候的处理有所不同.

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        if head == None or head.next == None:
            return head
        dummy = ListNode(-1)
        pre = dummy  #上一个点
        cur = head   #当前点
        pre.next = cur
        while cur and cur.next:
            if cur.next != None and cur.val != cur.next.val:
                pre = cur
                cur = cur.next
            else:
                while cur.next != None and cur.val == cur.next.val:
                    cur = cur.next
                pre.next = cur.next
                cur = cur.next
        return dummy.next

思路二

递归
终止条件:没节点了
这一步要做什么:遇到重复元素cur就一直往下走
这一步返回什么:已经删除重复元素的链表头节点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值