顺序表小题
- 移除元素
- 思路一
- 思路二
- 合并两个有序数组
- 思路一
- 思路二
移除元素
链接: 题目链接
思路一
创建新的数组,遍历原数组,将不为val的值放到新数组中
思路二
双指针法。
创建两个变量src,dst。
1)若src指向的值为val,则src++
2)若src指向的值不是val,nums[dst]=nums[src],src++,dst++
//numSize表示的是数组的长度
int removeElement(int* nums, int numSize, int val)
{
int src, dst;
src = dst = 0;
while (src < numSize)
{
if (nums[src] == val)
{
src++;
}
else
{
nums[dst] = nums[src];
dst++;
src++;
}
}
//此时dst的值正好就是新数组的长度
return dst;
}
合并两个有序数组
链接: 题目链接
思路一
将num2中数据依次放入到num1数组的后面,用排序算法对num1进行排序。
思路二
用三个指针。
l1指向num1末尾,l2指向num2末尾,l3指向两者相加的末尾。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int l1 = m - 1;
int l2 = n - 1;
int l3 = m + n - 1;
while (l1 >=0 && l2 >=0)//只要有一个条件为假就跳出
{
if (nums1[l1] < nums2[l2])
{
nums1[l3--] = nums2[l2--];
}
else
{
nums1[l3--] = nums1[l1--];
}
}
//出了循环有两种情况,l1<0或者l2<0
//是否存在l1和l2同时小于0的情况呢?不存在
//而且虽然有两种情况,我们也只用处理一种情况,即l1<0
//说明l2中的而数据还没有完全放入到num1中
while (l2 >= 0)
{
nums1[l3--] = nums2[l2--];
}
//此时num1包含了nums2中的数据,num1是升序数组
}