题目解析:
将数字以链表的形式逆序储存,每个Node储存一位数字。
然后实现两个链表相加。
思路解析:
1、数字的位数可能不同,我们怎么解决这个问题,开始我想的特别复杂,想的是先比较两个链表的长短,然后在把所有数都加到长的链表上,但是简单的方法应该是不用考虑那么多,另外定义一个链表,然后将每次加和的结果放到这个链表里,如果长度不一,也没关系,只需要加完长度相同的部分,再去循环剩下的部分。
2、还需要考虑进位,两数之和大于10的情况,开始我的想法是什么呢?就是计算加和,然后求出模10的结果,思路应该没问题,但是因为前面大方向的错误,导致耦合性特别高,牵一发而动全身,导致后面各种错误。(吸取教训)
3、在最后也要注意,最后以为相加若大于0,那么我们还得进位。
代码:
/**
* 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* p=new ListNode(0);
ListNode* top=p;
ListNode* q=NULL;
int flag =0;
int tmp;
while(l1&&l2)
{
tmp=l1->val+l2->val+flag;
flag=tmp/10;
q=new ListNode(tmp%10);
p->next=q;
p=p->next;
l1=l1->next;
l2=l2->next;
}
while(l1)
{
tmp=l1->val+flag;
q=new ListNode(tmp%10);
flag=tmp/10;
p->next=q;
p=p->next;
l1=l1->next;
}
while(l2)
{
tmp=l2->val+flag;
q=new ListNode(tmp%10);
flag=tmp/10;
p->next=q;
p=p->next;
l2=l2->next;
}
if(flag==1)
{
q=new ListNode(1);
p->next=q;
}
return top->next;
}
};
反思
1、思路一定要清晰,把握好大方向,尽最大可能将大的问题化为小的问题,并且一定要降低耦合性,否则你会杀死自己的,一定要记住今天的教训。
2、对链表的一些思考,链表真的是方便插入,所以我们在使用时,就会很方便,只需要将指针对应起来就行
3、还有一定要用笔将整个过程想清楚,不要什么都没想清楚就开始打代码。
网友评论