leetcode:83. 删除排序链表中的重复元素

题目来源

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

题目描述

在这里插入图片描述

题目解析

递归

class Solution {
public:
	// 定义:删除head重复元素
    ListNode* deleteDuplicates(ListNode* head) {
        if(head == nullptr || head->next == nullptr){
            return head;
        }
       
        // head为基准, head.next应该执行第一个不等于head.val的节点
        // curr为待比较的值
        ListNode *curr = head->next;
        if(head->val != curr->val){  // 如果不相等
            head->next = deleteDuplicates(curr);
        }else{
            // 如果不相等,找到第一个不等于head.val的值
            curr = curr->next;
            while (curr != nullptr && curr->val == head->val){
                curr = curr->next;
            }
            head->next = deleteDuplicates(curr);  
        }
        return head;
    }
};

在这里插入图片描述

利用排序链表的排序

指定 cur 指针指向头部 head
当 cur 和 cur.next 的存在为循环结束条件,当二者有一个不存在时说明链表没有去重复的必要了
当 cur.val 和 cur.next.val 相等时说明需要去重,则将 cur 的下一个指针指向下一个的下一个,这样就能达到去重复的效果
如果不相等则 cur 移动到下一个位置继续循环
时间复杂度:O(n)

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode cur = head;
        while (cur != null && cur.next != null){ // 可能有的元素
            if (cur.val == cur.next.val){
                cur.next = cur.next.next;
                // 因为我们不知道当前节点元素是否和当前节点的下一个的下一个元素是否相等,所以cur不需要前移
            }else{
                cur = cur.next;
            }
        }

        return head;
    }
}

在这里插入图片描述

使用set

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

        HashSet<Integer> set = new HashSet<>();
        ListNode cur = head;
        ListNode t = null;
        while (cur != null){
            if (set.contains(cur.val)){
                t.next = cur.next;
                cur = cur.next;
            }else{
                set.add(cur.val);
                t = cur;
                cur = cur.next;
            }
        }
        
        return head;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值