算法题
合并两个有序链表
cpp
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for (int i = 0; i<n; ++i) {
nums1[m + i] = nums2[i];//直接将num2的数据插入到num1的尾部
}
sort(nums1.begin(), nums1.end());//排序一下
}
};
时间复杂度:O((m+n)log(m+n))。
排序序列长度为 m+n,套用快速排序的时间复杂度即可,平均情况为 O((m+n)log(m+n))。
空间复杂度:O(log(m+n))。
排序序列长度为 m+n,套用快速排序的空间复杂度即可,平均情况为 O(log(m+n))。
采用双指针的写法
cpp
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int* temp = (int*)malloc(sizeof(int) * (m + n));//开辟一个新数组,数组空间位m+n
int i = 0, j = 0;//i指向num1,j指向num2
int index = 0;//定义一个新数组的下标指针
while (i < m && j < n) {
if (nums1[i] >= nums2[j]) {//哪个小就先存哪个
temp[index++] = nums2[j++];
} else {
temp[index++] = nums1[i++];
}
}
while (i < m) {//如果num1有剩余,就将num1的剩余值加进新数组
temp[index++] = nums1[i++];
}
while (j < n) {
temp[index++] = nums2[j++];
}
index = 0;
for (int i = 0; i < (m + n); i++) {
nums1[i] = temp[index++];//因为要把数值合并到一个数组中,所以覆盖num1
}
free(temp);//释放内存
}
};
基础知识
指针是什么有哪些用途?
- 变量地址引用:
cpp
int a;
int *p=&a;
- 动态内存的分配
cpp
int *p=(int*)malloc(1024);
- 数组与字符串操作
cpp
char str[] = "Hello";
char *ptr = str;
- 函数参数传递
cpp
void int(int *nums){
}
引用和指针有什么区别?
- 引用必须初始化,且不能初始化为空,指针没有要求
- 引用不能修改引用指向,指针可以
- 引用没有多级引用的观点,指针可以有多级指针,一级指针,二级指针等
- 引用实质是指针常量
- 引用传递的则是实参本身,指针作为函数参数传递的其实是指针变量的值
- 引用用sizeof运算符计算的就是指向的变量本身的大小,指针则是指针变量的大小
- 引用用起来比指针更安全,指针有悬挂指针,野指针等
- 引用代码看起来比指针简洁