您的位置:首页 > 其它

Add Two Numbers 看着简单,其实各种奇葩情况需要考虑。。。

2014-08-31 13:50 239 查看
/**
* 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) {
int v1,v2,v,a=0;
if(l1==NULL&&l2==NULL)
return NULL;
ListNode *l=new  ListNode(0);//有一个错误就是,头指针不能变,始终指向头部,然后指针用于定位插入位置
//所以建立一个新链表必须要三个指针,头指针,遍历指针,还有新节点的指针
//注意头指针的下一个位置才是真正存数据的
ListNode *p=l;
while(l1&&l2) {
ListNode *node=new  ListNode(0);
v1=l1->val;
v2=l2->val;
v=(v1+v2+a)%10;
a=(v1+v2+a)/10;
l1=l1->next;
l2=l2->next;
node->val=v;
p->next=node;
p=p->next;
}
//没有考虑两个链表长度一样, 出现最后一次相加还有进位 的情况
//没有考虑l1,l2本身大于10的进位情况
//最需要注意的是,关于最后一次进位的条件判断应该放在,所有相同或者不同长度链之后!!
while(l1) {
ListNode *node=new  ListNode(0);
node->val=(l1->val+a)%10;
a=(l1->val+a)/10;
p->next=node;
p=p->next;
l1=l1->next;
}
while(l2){
ListNode *node=new  ListNode(0);
node->val=(l2->val+a)%10;
a=(l2->val+a)/10;
p->next=node;
p=p->next;
l2=l2->next;
}
if(l1==NULL&&l2==NULL&&a!=0)//放最后,以防附加后的链路最后一次还有进位
{
ListNode *node=new  ListNode(a);
p->next=node;
}
return l->next;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: