Mental Model
Use two pointers to keep track of unique elements and overwrite duplicates in place.
Analogy: Imagine sorting your bookshelf and moving only unique books forward, skipping duplicates as you go.
[1, 1, 2, 2, 3, 3, 4] ↑ ↑ left right
[1, 1, 2, 2, 3, 3, 4] ↑ ↑ left right
[1, 1, 2, 2, 3] ↑ ↑ left right
[1, 1, 2, 2, 3] ↑ ↑ left right
[1, 2, 2, 2, 3]
↑ ↑
left right[1, 2, 2, 2, 3]
↑ ↑
left right[1, 2, 3, 2, 3]
↑ ↑
left right[1, 2, 3, 2, 3]
↑
left[1, 2, 3, 2, 3] Unique length = 3
#include <stdio.h> int removeDuplicates(int* nums, int numsSize) { if (numsSize == 0) return 0; int left = 0; for (int right = 1; right < numsSize; right++) { if (nums[right] != nums[left]) { left++; nums[left] = nums[right]; } } return left + 1; } int main() { int nums[] = {1, 1, 2, 2, 3}; int size = sizeof(nums) / sizeof(nums[0]); int newLength = removeDuplicates(nums, size); for (int i = 0; i < newLength; i++) { printf("%d", nums[i]); if (i < newLength - 1) printf(" -> "); } printf(" -> null\n"); printf("Unique length = %d\n", newLength); return 0; }
if (numsSize == 0) return 0;int left = 0;for (int right = 1; right < numsSize; right++) {if (nums[right] != nums[left]) {left++;nums[left] = nums[right];return left + 1;if (numsSize == 0) return 0;
if (nums[right] != nums[left]) {if (nums[right] != nums[left]) {