LeetCode——002两数相加

这是一个中等难度题。let me try 1 try!

LeetCode——002两数相加

题目

解决方法

思路

题中提到了可以假设除过数字0之外,也就是说我们可以假设所有的数字都不是以0开头。

大略看一下这是一个用单链表来实现按位加的功能,而且不需要逆置。需要注意的地方是因为链表是逆置的,所以发生进位的时候是要向单链表的下一位进位。除此之外貌似其他的都不难。

遇到的问题

开始实际实现,发现了其中还涉及到了一些知识,比如:链表实时空间的开辟、next指针的问题、加法逻辑的判断等等。虽然之前都会,但是现在都有些生疏了,而且是之前的问题都被整合到了一块。要解决这个问题,需要好几部分的知识。忽然之间就懵了,不知道该怎么开始。

学到了一个little tip。不知道怎么形容。看一下代码:

1
2
3
4
5
6
Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

在一个Node中加上了构造函数,这样可以直接使用初始化列表进行初始化。直接传参,初始化下一个节点的值,还直接把next指针指空。之前太蠢了,都是傻傻的写专门的方法来完成这个功能的。

程序

断断续续已经两天了,今儿下午结果终于对了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* l3=new ListNode(-1); //储存加法结果
ListNode* cur=l3; //临时指针
int sum=0;
bool symb=false; //一个标志,为true代表当前位上一位有进位
while(l1!=NULL || l2!=NULL)
{
sum=0;
if(l1!=NULL)
{
sum+=l1->val;
l1=l1->next;
//此处需要注意的是,l1和待会的l2都没有使用临时指针来替代,但是实际上,对原l1,l2链表的指针是不会产生影响的
}
if(l2!=NULL)
{
sum+=l2->val;
l2=l2->next;
}
if(symb)
{
sum++;
}
cur->next=new ListNode(sum%10);
cur=cur->next;
symb=sum>9?true:false;
}
//还有单独再使用一次symb的原因是怕最高位加法之后再产生进位。
if(symb)
{
cur->next=new ListNode(1);
}
return l3->next;
}
};

解决方法2

思路

把数字都提取出来->做加法->倒序写个链表->返回链表的指针

基本就酱。可以见的是数字提取和倒序写链表会有点挑战。先开坑。什么时候填坑看天意。

总结

我看答案了,不过跟我想的基本没有偏差。总的来说呢,还是菜。想法脑子能很快在脑子里成型。但是就是写不出来。面试、包括还有将来的实际生产中将想法实现也是很重要的。慢慢练习吧。之前忘了在哪看到的TED好像,讲的是在涉及某种新的领域的时候,常常会感觉很吃力,不适应。就像大脑在”舒适区”待久了,自然而然的就会产生排异反应,这个时候就需要坚持下去,难受习惯了就不会觉得难受了(哈哈开玩笑!实际上是大脑会有某种变化让你更适合去开展这种工作)。

这种题一部分是需要思路。但是对我来说更重要的是要培养用流程化的思维去解决问题的能力。就像vim的键盘宏功能,而不是光有思路就行。万一哪天面试官让我手撕代码,代码写不出来?估计就凉的跟凉凉似了科科!

说起键盘宏,昨晚看B站发现vim竟然还有录制键盘宏的功能。博客上传了就去玩玩🤓

还有这个问题明天还得再看一次。强化一下记忆。