2. Add Two Numbers
题意:给出两个非空的链表代表两个非负数,每位数字再链表中逆序存放。
思路1:将链表各个数读出来,存到两个int里,最后相加得出答案,再转化为链表返回。问题:数据容易超出范围,遇到这种特地不用整型表示的题应该快速想到这一点。
思路2:创建链表,直接计算,各位相加,并控制进位,最终每位数都读取完了就返回。题目中特地黑体强调了逆序存放数字,让人很想从链表的最后一个节点开始进行加法(加法都是从个位开始运算),其实不然。因为链表的第一位已经代表了数字的最后一位数。
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int tmp=0;
ListNode *ret=new ListNode(0);
ListNode *cur=ret;
while(1)
{
if(l1!=NULL)
{
tmp+=l1->val;
l1=l1->next;
}
if(l2!=NULL)
{
tmp+=l2->val;
l2=l2->next;
}
cur->val=tmp%10;//修改当前节点的val
tmp=tmp/10;
if(l1!=NULL||l2!=NULL||tmp)//最后一位是进位要处理
cur=(cur->next=new ListNode(0));//创建新节点赋给cur->next,再将cur设置为该新节点
else
break;
}
return ret;
}