首先,这个数组是逆序排序的。。。
我开始想的是按顺序读出链表中的值组成真正的值i,j,然后直接计算i+j。
其中,
i=i*10+l1->val;
但是,这个适合正序的,不适合逆序。。。
本来想直接使用进位进行计算,但是逻辑上出现了问题。
首先,最开始想的循环条件是
while(l1!=NULL && l2!=NULL)
然后只剩下l1不为空或者l2不为空,然后分别把l1,l2后面的值续在结果的后边就行了,但是,没考虑到还需要同时处理最后一次的进位算符。
以下为所错误代码
/**
* 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* result = new ListNode(-1); //储存结果
ListNode* p=result;
int count=0;
while(l1!=NULL && l2!=NULL){
int sum=l1->val+l2->val+count;
p->next=new ListNode(sum%10);
if( sum/10 !=0){
count = 1;
}
else{
count=0;
}
l1=l1->next;
l2=l2->next;
p=p->next;
}
//只剩下l1或者l2
if(count==1){
p->next=new ListNode(1);
}
bool flag=0; //看是否为第一次,需要考虑进位
for(;l1!=NULL;l1=l1->next,p=p->next){
if(flag==0){
p->next=new ListNode(l1->val+count);
}
else{
p->next=new ListNode(l1->val);
}
flag=1;
}
for(;l2!=NULL;l2=l2->next,p=p->next){
if(flag==0){
p->next=new ListNode(l2->val+count);
}
else{
p->next=new ListNode(l2->val);
}
flag=1;
}
return result->next;
}
};
这么下来发现
[1]
[9,9]
输出:
[0,10]
预期:
[0,0,1]
样例过不去。因为还需要考虑第一次进位count和原数相加是否会大于等于10,若为10,还需要进一步处理。
正确思路为:首先判断跳出循环后的第一次进位是否会出现特殊情况
情况1:l1,l2都是空的,但是count=1,需要添加一位。
情况2:l1还有,count=1,并且,第一次count+l1->val 还需要处理进位。
情况3:同上,只不过把l1换成l2。
其实一共有三个变量,但是只需要独立考虑l1和count的关系和l2和count的关系,他们又是对称的,所以只需要考虑一种
l1=空 | l1不空 | |
count=0 | 直接续上 | 直接续上 |
count=1 | 多添加一位 | 看其是否产生进位 |
因为此算法较为繁琐,故后来放弃。
后来,采用了判断条件
while(l1!=NULL || l2!=NULL)
代码如下
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* result = new ListNode(-1); //储存结果
ListNode* p=result;
int count=0;
while(l1!=NULL || l2!=NULL){
int sum=0; //因为是或运算,可能出现l1或l2为空的情况,会导致无val值,所以需要if来筛选
if(l1!=NULL){
sum+=l1->val;
l1=l1->next; //最开始把该句写在了if外面,会导致程序执行错误。
}
if(l2!=NULL){
sum+=l2->val;
l2=l2->next;//同上
}
if(count!=0)
sum+=count;
p->next=new ListNode(sum%10);
if( sum/10 !=0){
count = 1;
}
else{
count=0;
}
p=p->next;
}
//最后单独考虑l1,l2都用完了,但是count=1的情况。
if(count==1)
p->next=new ListNode(1);
return result->next;
}
};
该算法还算比较简介,只需要注意循环中对l1,l2空值的处理即可。
ps:好久没编程了,还是生疏了。。。就这还弄了半天。。。。