AC代码在最后!
想法:
leetcode居然不支持malloc,
所以我学了new。
附上new的用法:
new其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上。通常来说,当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。另外需要注意的是,new的使用格式,new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。具体的代码如下:
#include <iostream>
using namespace std;
int example1()
{
//可以在new后面直接赋值
int *p = new int(3);
//也可以单独赋值
//*p = 3;
//如果不想使用指针,可以定义一个变量,在new之前用“*”表示new出来的内容
int q = *new int;
q = 1;
cout << q << endl;
return *p;
}
int* example2()
{
//当new一个数组时,同样用一个指针接住数组的首地址
int *q = new int[3];
for(int i=0; i<3; i++)
q[i] = i;
return q;
}
struct student
{
string name;
int score;
};
student* example3()
{
//这里是用一个结构体指针接住结构体数组的首地址
//对于结构体指针,个人认为目前这种赋值方法比较方便
student *stlist = new student[3]{{"abc", 90}, {"bac", 78}, {"ccd", 93}};
return stlist;
}
int main()
{
int e1 = example1();
cout <<"e1: "<< e1 << endl;
int *e2 = example2();
for(int i=0; i<3; i++)
cout << e2[i] << " ";
cout << endl;
student *st1 = example3();
for(int i=0; i<3; i++)
cout << st1[i].name << " " << st1[i].score << endl;
return 0;
}
以及new和delete的其他用法:
new 运算符还有第二种用法,用来动态分配一个任意大小的数组:
T *p =new T[N];
其中,T 是任意类型名,p 是类型为 T* 的指针,N 代表“元素个数”,可以是任何值为正整数的表达式,表达式中可以包含变量、函数调用等。这样的语句动态分配出 N × sizeof(T) 个字节的内存空间,这片空间的起始地址被赋值给 p。例如:
int* pn;
int i = 5 ;
pn = new int[i*20];
pn[0] = 20 ;
pn[100] = 30;
最后一行编译时没有问题,但运行时会导致数组越界。因为上面动态分配的数组只有 100 个元素,pn[100] 已经不在动态分配的这片内存区域之内了。
如果要求分配的空间太大,操作系统找不到足够的内存来满足,那么动态内存分配就会失败,此时程序会拋出异常。
程序从操作系统动态分配所得的内存空间在使用完后应该释放,交还操作系统,以便操作系统将这片内存空间分配给其他程序使用。C++ 提供 delete 运算符,用以释放动态分配的内存空间。
int* p = new int;
*p = 5;
delete p;
delete p; //本句会导致程序出错
如果是用 new 的第二种用法分配的内存空间,即动态分配了一个数组,那么释放该数组时,应以如下形式使用 delete 运算符:
int* p = new int[20];
p[0] = 1;
delete[] p;
如果动态分配了一个数组,但是却用delete p
的方式释放,没有用[]
,则编译时没有问题,运行时也一般不会发生错误,但实际上会导致动态分配的数组没有被完全释放。
牢记,用 new 运算符动态分配的内存空间,一定要用 delete 运算符释放。否则,即便程序运行结束,这部分内存空间仍然不会被操作系统收回,从而成为被白白浪费掉的内存垃圾。这种现象也称为“内存泄露”。
注意,释放一个指针,并不会使该指针的值变为 NULL。
题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
AC代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
struct ListNode *ptr1=l1,*ptr2=l2,*l3,*ptr3,*ptr,*last = NULL;
int t = 0,n,cnt = 0;
while(ptr1 && ptr2)
{
n = ptr2->val + ptr1->val + t;
t = n / 10;
ptr3 = new struct ListNode(n % 10);
if(last == NULL)
{
l3 = ptr3;
}
else
{
last->next = ptr3;
}
ptr1 = ptr1->next;
ptr2 = ptr2->next;
last = ptr3;
}
ptr=ptr1?ptr1:ptr2;
while(ptr)
{
n = ptr->val + t;
t = n / 10;
ptr3 = new struct ListNode(n % 10);
if(last == NULL)
{
l3 = ptr3;
}
else
{
last->next = ptr3;
}
ptr = ptr->next;
last = ptr3;
}
if(t != 0)
{
ptr3 = new struct ListNode(t);
last->next = ptr3;
t = 0;
last = ptr3;
}
last->next = NULL;
return l3;
}
};