首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【LeetCode每日一题】:链表(C和C++版本 快慢指针)

【LeetCode每日一题】:链表(C和C++版本 快慢指针)

作者头像
用户11915063
发布2025-11-20 09:54:14
发布2025-11-20 09:54:14
190
举报

题目链接:

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

题目描述:

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k

示例:

思路:

首先定义两个数组的下标fast和slow,初始时slow=fast=1,题中要求删除重复的元素,我们的大概思路就是fast往后走,如果遇到slow位置处不同的数字,就让nums[fast]赋值给nums[slow],然后slow++,fast也++,如果fast往后走的过程中遇到的数字与slow位置处的数字相同,那么就让fast继续往后走,也就是fast++,最后fast走到numsSize为止,此时slow的位置就是要求的不唯一数组的个数

图解:

代码实现:

C版本:
代码语言:javascript
复制
int removeDuplicates(int* nums, int numsSize) 
{
    if(numsSize==0)
    {
        return 0;
    }
    int fast=1,slow=1;
    while(fast<numsSize)
    {
        if(nums[fast]!=nums[fast-1])
        {
            nums[slow]=nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
}
C++版本:
代码语言:javascript
复制
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }
        int fast = 1, slow = 1;
        while (fast < n) {
            if (nums[fast] != nums[fast - 1]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow;
    }
};

复杂度分析:

时间复杂度:O(N)


相关知识博客:

【数据结构初阶】--双向链表(一)

【数据结构初阶】--双向链表(二)

总结:这道题运用到了数据结构——链表,相关链表的结构在之前数据结构初阶的学习中就已经给大家讲解过了,大家可以翻看之前的博客进行回顾总结,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目链接:
  • 题目描述:
  • 示例:
  • 思路:
  • 代码实现:
    • C版本:
    • C++版本:
  • 复杂度分析:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档