Solution
solution 用java写的,给了一些对链表的解释,但是感觉代码写的不是很明白,查看了22ms(最短)的代码。
static const auto _____ = []()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *head = new ListNode(0);
ListNode *tail = head;
int carry = 0;
while(l1 || l2 || carry){
int n = (l1?l1->val:0) + (l2?l2->val:0) + carry;
tail -> next = new ListNode(n % 10);
carry = n / 10;
tail = tail -> next;
l1 = l1?l1 -> next:NULL;
l2 = l2?l2 -> next:NULL;
}
return head -> next;
}
};
定义了head和tail,head是不变的,tail在变,一直是链表的末尾。
犯错的点
- 1 不要先将两个输入链表转化为整数相加后再输出,因为输入链表的长度可能很长,转换为整型很可能会溢出。
- 2 绝对不要这样写
while(...)
{
...
curr = new ListNode(tmp%10);
curr = curr->next;
...
}
- 这样写是错的,错在每次为curr赋值,curr都更新了,curr的val更新为 tmp%10,curr的next更新为NULL,然后curr再赋值为了curr->next,即NULL,相当于啥都没干,curr又成NULL了。。。我怎么这么智障?
- 所以应该怎么做? 首先必须得定义链表的起点,然后给这个起点赋值,即需要用构造函数进行构造,构造函数给val赋值,同时给next赋值为空。现在起点确定了,起点的val和next已经确定了(next 为NULL),但是要将这个链表接下去,需要更新next。
之后继续接链表时同理,将一个节点的next用构造函数赋值后,下一个节点已经确定了,只是其next为NULL,接链表只需要更改其next为一个新的ListNode。
即
while(...)
{
...
curr->next = new ListNode(tmp%10);
curr = curr->next;
...
}
结构体的初始化
1 是否需要初始化
- 结构体指针必须初始化,如果只是定义,则没有分配内存空间。同时结构体指针的成员指针也必须初始化。
- 结构体变量定义的时候已经分配了内存空间。可以不初始化。
参考https://www.cnblogs.com/yanchengwang/p/5577905.html
2 结构体初始化的方式
- C/C++结构体初始化的方式
- 如果结构体带有构造函数,则不能用大括号(C的方式)初始化。
Runtime
44ms