使用快慢指针:快,慢指针从坐标0开始,当所指的值一样,快指针加一,值不一样时,快慢指针都加一。当快指针遍历链表时,给慢指针的坐标值加一就是去重后的长度。
int removeDuplicates(vector<int>& nums) {
if(nums.empty()) return 0;
int slow=0,fast=0,n=nums.size();
while(fast<n){
if(nums[slow]==nums[fast]) fast+=1;
else nums[++slow]=nums[fast++];
}
return slow+1;
}
使用for,原理和快慢指针一样
int removeDuplicates(vector<int>& nums) {
if(nums.empty()) return 0;
int j=0;
for(int i=0;i<nums.size();i++){
if(nums[j]!=nums[i]) nums[++j]=nums[i];
}
return j+1;
}
快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。
应用:判断单链表是否为循环链表
在有序链表中寻找中位数
如果链表为存在环,如何找到环的入口。
快慢指针应用的博客