实习冲刺Day7
算法题
合并两个有序链表
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))。
采用双指针的写法
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int* temp = (int*)malloc(sizeof(int) * (m + n));//开辟一个新数组,数组空间位m+nint i = 0, j = 0;//i指向num1,j指向num2int 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);//释放内存}
};
基础知识
指针是什么有哪些用途?
-
变量地址引用:
int a;
int *p=&a;
-
动态内存的分配
int *p=(int*)malloc(1024);
-
数组与字符串操作
char str[] = "Hello";
char *ptr = str;
-
函数参数传递
void int(int *nums){}
引用和指针有什么区别?
- 引用必须初始化,且不能初始化为空,指针没有要求
- 引用不能修改引用指向,指针可以
- 引用没有多级引用的观点,指针可以有多级指针,一级指针,二级指针等
- 引用实质是指针常量
- 引用传递的则是实参本身,指针作为函数参数传递的其实是指针变量的值
- 引用用sizeof运算符计算的就是指向的变量本身的大小,指针则是指针变量的大小
- 引用用起来比指针更安全,指针有悬挂指针,野指针等
- 引用代码看起来比指针简洁