Leetcode80 删除有序数组中的重复项 II(大白话说思路)——数组专题

这篇博客探讨了如何通过一种通用的思路有效地删除有序数组和链表中的重复元素。在数组中,使用双指针技巧,移动一个指针(cur)来跟踪新数组的边界,同时另一个指针(temp)用于寻找下一个不重复的元素。在链表中,同样利用类似的方法更新节点连接,避免重复节点。这种方法适用于有序数据结构,能够减少重复并保持元素的原始顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:只需掌握一个套路,如何移动下标从当前位置找到第一个不等于当前位置值的下标???
模板如下

int temp = i;
while(temp<nums.size()&&nums[temp]==nums[i])temp++;
i  =temp;

删除删除有序数组中的重复项

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int cur = 0;
        for(int i=0;i<nums.size();){
        	//填上cur对应的位置,cur往后移一位
            nums[cur++] = nums[i];
         	//移动下标从当前位置找到第一个不等于当前位置值的下标
            int temp = i;
            while(temp<nums.size()&&nums[temp]==nums[i])temp++;
            i = temp;
        }
        return cur;
    }
};

删除删除有序数组中的重复项2

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int cur = 0;
        for(int i=0;i<nums.size();){
            nums[cur++] = nums[i];
            //防止越界
            if(i==nums.size()-1)break;
            //如果有连续的继续操作
            if(nums[i+1]==nums[i]){
                nums[cur++] = nums[i+1];
            }
            //移动下标从当前位置找到第一个不等于当前位置值的下标
            int temp = i;
            while(temp<nums.size()&&nums[temp]==nums[i])temp++;
            i = temp;
        }
        return cur;
    }
};

链表也是类似的
删除排序链表中的重复元素

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* p = head;
        while(p){
        	//移动指针从当前位置找到第一个不等于当前位置val的链表节点指针
            ListNode*temp =p;
            while(temp!=NULL&&temp->val ==p->val)temp = temp->next;
            //连接
            p->next = temp;
            p = temp;
        }
        return head;
    }
};

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

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* p) {
        //if(!head)return NULL;
        ListNode*dummy = new ListNode(-1);
        dummy->next = p;
        ListNode*pre  =dummy;
        while(p&&p->next){
            if(p->next&&p->next->val!=p->val){
                pre = p;
                p = p->next;
                continue;
            }
            //第二种情况
           //pre位置不变
            //移动指针从当前位置找到第一个不等于当前位置val的链表节点指针
            auto temp = p;
            while(temp&&temp->val==p->val)temp=temp->next;
            p = temp;
            //连接
            pre->next = p;
        }
        return dummy->next;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值