删除有序数组/链表中的重复元素

举报
kongla 发表于 2024/05/22 11:48:13 2024/05/22
【摘要】 双指针的使用

上例题

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。


引入双指针思想,让慢指针 slow 走在后面,快指针 fast 走在前面,fast 找到一个不重复的元素就告诉 slow 并让 slow 接着走一步。这样当 fast 指针遍历完整个数组 nums 后,slow走过的数组元素就是删除重复元素后的数组元素。

上代码

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if(n == 0) return 0;
        int slow = 0, fast = 1;
        while(fast < n)
        {
            if(nums[fast] != nums[slow])
            {
                slow++;
                nums[slow] = nums[fast];
             }
             fast++;
        }
        return slow+1;
    }
};

同类型上例题

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

给定一个已排序的链表的头 head ,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。

输入:head = [1,1,2,3,3]
输出:[1,2,3]


上代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head == NULL) return NULL;
        ListNode *slow = head, *fast = head->next;
        while(fast != NULL)
        {
            if(fast->val != slow->val)
            {
                slow->next = fast;
                slow = slow->next;
            }
            fast = fast->next;
        }
        slow->next = NULL;
        return head;
    }
};
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。