AddTwoNum
这次和BinaryAdd其实是一道题,这种题目也比较关键。就是对于复杂的条件仔细分析,出了一点问题就过不了了。
先从一般的情况开始,假设两个linklist都非空,那么就是加上两个值及进位,典型的尾插法,注意处理第一次head,我习惯用个bool值区分。注意tail最好尾部
next赋NULL避免后面再处理了。循环结束三类条件:2.1 两个都空,这时要注意是否有进位产生新的一位,如果有的话(forward==1),那么多插一个点,否则不做。
2.2 其中一个空,另一个相似处理。假设p1空,那么又分两种,2.2.1 如果不需要再往前进位了,直接结束,否则,2.2.2 要一直往前进位指导不再进位或者p空为止(此时要尾部多加一个1),这里面的while循环
我好几次都写挂了,一定是p2->val+=forward之后 判断是否>=10,所以最好的写法是集成到while的条件里,同时不要忘记p2判NULL
3 回到输入,判断两个linklist都空或者至少一个空,由于一个空的tail实在不好统一处理,因此 单独处理,其实这样也很方便
短短百行代码,里面的情况是非常多的,一定要特别仔细:
翻过的错误如下:
- 居然还会bool 判断语句写成first=true,导致一个奇怪的输出结果分析不出来
判断单链进位是否结束的时候 ,没有分析清楚,一定是进位之后判断是否>=10,同时要把进位操作做完,集成到while条件就不需要这步了。
其实有个简介的操作就是p1 p2交换指针,减少代码行数。ListNode addTwoNumbers(ListNode l1, ListNode *l2) {
if(l1==NULL && l2) return l2; if(l1 && l2==NULL) return l1; ListNode* p1=l1,*p2=l2, *lastp1,*lastp2,*tail,*head=NULL,*remainhead; int forward=0; bool first=true; while(p1 && p2) { int sum=p1->val+p2->val+forward; if(sum>=10) forward=1, sum-=10; else forward=0; if(first==true) { head=new ListNode(sum); head->next=NULL; tail=head; first=false; } else { ListNode* newnode=new ListNode(sum); newnode->next=NULL; tail->next=newnode; tail=tail->next; } p1=p1->next;p2=p2->next; } if(p1==NULL && p2) { //p2->val+=forward; remainhead=p2;
//if(p2->val+forward>=10)
//{
while(p2!=NULL && (p2->val+=forward)>=10)
{
//p2->val+=forward;
p2->val-=10;
forward=1;
lastp2=p2;
p2=p2->next;
}
if(p2==NULL)//final forard 1
lastp2->next=new ListNode(1),lastp2->next->next=NULL;
//}
//else
// p2->val+=forward;
tail->next=remainhead;
}
else if(p1 && p2==NULL)
{
//p1->val+=forward;
//if(p1->val>=10)
//p1->val-=10,forward=1;
remainhead=p1;
while(p1!=NULL && (p1->val+=forward)>=10)
{
//p1->val+=forward;
p1->val-=10;
forward=1;
lastp1=p1;
p1=p1->next;
}
//if(p1!=NULL)
// p1->val+=forward;
if(p1==NULL)//final forard 1
lastp1->next=new ListNode(1),lastp1->next->next=NULL;
//}
//else
// p1->val+=forward;
tail->next=remainhead;
}
else
{
if(forward==1)
tail->next=new ListNode(1),tail->next->next=NULL;
}
return head;
}
做了swap之后的代码:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
if(l1==NULL && l2) return l2;
if(l1 && l2==NULL) return l1;
ListNode* p1=l1,*p2=l2, *lastp1,*lastp2,*tail,*head=NULL,*remainhead;
int forward=0;
bool first=true;
while(p1 && p2)
{
int sum=p1->val+p2->val+forward;
if(sum>=10)
forward=1, sum-=10;
else
forward=0;
if(first==true)
{
head=new ListNode(sum);
head->next=NULL;
tail=head;
first=false;
}
else
{
ListNode* newnode=new ListNode(sum);
newnode->next=NULL;
tail->next=newnode;
tail=tail->next;
}
p1=p1->next;p2=p2->next;
}
if(p1==NULL && p2==NULL)
{
if(forward==1)
tail->next=new ListNode(1),tail->next->next=NULL;
}
else
{
if(p1 && p2==NULL)
swap(p1,p2);
//p2->val+=forward;
remainhead=p2;
//if(p2->val+forward>=10)
//{
while(p2!=NULL && (p2->val+=forward)>=10)
{
//p2->val+=forward;
p2->val-=10;
forward=1;
lastp2=p2;
p2=p2->next;
}
if(p2==NULL)//final forard 1
lastp2->next=new ListNode(1),lastp2->next->next=NULL;
//}
//else
// p2->val+=forward;
tail->next=remainhead;
}
return head;
}