今天刷到一道链表创建的题。平时做的基本是题目给你提供好的链表,而不需要自己创建。
举个例子,对于vector来说,其实,当我们声明如:
vector<int> v(10,0);
所调用的vector类的构造函数内部调用了new来给对象分配了空间。
因此,当你需要创建诸如:链表,二叉树等结构时,对于每一个新加入结点,
都必须为它new分配一个内存,否则,对于如下语句:
ListNode n(10);
ListNode* n = new ListNode(10);
第一条语句,当超出作用域时,会被系统删除掉,这样,你原本链表所链接的内存会被回收,亦即你从来没有创建过这么一个节点。
对于第二条,除非你自己释放空间,否则它会一直占用内存。
因此,创建任何数据结构,记得为它的每一个结点,new一个堆内存,然后再链接它。
力扣2题解:
class Solution {
public:
//或者完全可以用一条全新的链表,以空间换时间
//本题被卡住,主要是不会创建链表!!!,必须先申请一个新空间再链接过去*/
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
int carry = 0;
int sum = 0;
ListNode n(-1);
ListNode* current = &n; //用于创建新链表,指针变量自然可以改变指向的变量
while( l1!=nullptr && l2!=nullptr )
{
sum = l1->val+l2->val+carry;
ListNode* p = new ListNode( sum%10 );
carry = sum/10;
//ListNode p( carry );错误写法,随时被系统回收内存
current->next = p;
//n = *(n.next);错误写法,随时更改了头地址内容
current = current->next;
l1 = l1->next;
l2 = l2->next;
}
if( l1==nullptr && l2==nullptr )
{
if ( carry != 0 )
{
//ListNode p( carry ); 错误写法,随时被系统回收内存
ListNode* p = new ListNode(carry);
//n.next = &p;错误写法,随时更改了头地址内容
current->next = p;
}
}
else if( l1!=nullptr && l2==nullptr )
{
while( l1!=nullptr )
{
sum = l1->val+carry;
//ListNode p( sum%10 ); //return时空间会被释放掉,就不存在了,必须new空间出来
ListNode* p = new ListNode(sum%10);
carry = sum/10;
//n.next = &p;
current->next = p;
//n = *(n.next);
current = current->next; //= &p;
l1 = l1->next;
}
if ( carry != 0 )
{
//ListNode p( carry );
//n.next = &p;
ListNode* p = new ListNode(carry);
current->next = p;
}
}
else if( l1==nullptr && l2!=nullptr )
{
while( l2!=nullptr )
{
sum = l2->val+carry;
//ListNode p( sum%10 );
ListNode* p = new ListNode(sum%10);
carry = sum/10;
//n.next = &p;
current->next = p;
//n = *(n.next);
current = current->next;
l2 = l2->next;
}
if ( carry != 0 )
{
//ListNode p( carry );
ListNode* p = new ListNode(carry);
//n.next = &p;
current->next = p;
}
}
return n.next;//ans->next;//&n;//ans->next;
}
};