/**
1. Definition for singly-linked list.
2. struct ListNode {
3. int val;
4. ListNode *next;
5. ListNode(int x) : val(x), next(NULL) {}
6. };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* ans=new ListNode(0);
ListNode* p=ans;
bool carry=false;
while(l1!=NULL||l2!=NULL){
int sum=0;
if(l1!=NULL){
sum+=l1->val;
l1=l1->next;
}
if(l2!=NULL){
sum+=l2->val;
l2=l2->next;
}
if(carry) sum++;
p->next=new ListNode(sum%10);
p=p->next;
carry=sum>=10?true:false;
}
if(carry)
p->next=new ListNode(1);
return ans->next;
}
};
思路:
1.此类模拟加法器的算法,在按位进行运算时,首先要设置一个用来记录进位的变量:
bool carry=false;
当前位之和大于或等于10时,carry位设为true,下一次运算时,高位的运算结果自增。
2.运算的结果,其链表长度应当与l1,l2中的较长者相同或者多一位,所以在设置循环条件时,应当为:
while(l1!=NULL||l2!=NULL)
而不是
while(l1!=NULL&&l2!=NULL)
再想着将长出来的部分接在结果后面,这样会使最高位的仅为处理出现困难。