class Solution { public: string addBinary(string a, string b) { reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); string a1,a2; if(a.length()>=b.length()) { a1=a; a2=b; } else { a1=b; a2=a; } string c=a1;//此处必须是a1 int flag=0; for(int i=0;i<a2.length();i++) { c[i]=a1[i]+a2[i]-'0'-'0'+flag; if(c[i]>=2) { flag=1; c[i]=c[i]+'0'-2; } else {c[i]=c[i]+'0';flag=0;} } for(int j=a2.length();j<a1.length();j++) { c[j]=a1[j]-'0'+flag; if(c[j]>=2) { flag=1; c[j]=c[j]+'0'-2; } else {c[j]=c[j]+'0';flag=0;} } if(flag==1)c+='1'; reverse(c.begin(),c.end()); return c; } };
LinkList Sum
不能调用构造函数创造新结点,会发生隐式转换。所以只能采用原来的结点。不使用翻转链表,会造成超时。
/** * 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) { assert(l1!=NULL&&l2!=NULL); ListNode *p,*q; int n1=0,n2=0; for(p=l1;p;p=p->next) n1++; for(q=l2;q;q=q->next) n2++; if(n1<n2) { ListNode *temp=l1; l1=l2; l2=temp; } q=l1; for(p=l2;p;p=p->next) { q->val=p->val+q->val; q=q->next; } l2->next=NULL;//只能置为null l2->val=0;//初始值0 for(q=l1;q;q=q->next) { if(q->val>=10) { if(q->next==NULL) { q->next=l2; } q->val-=10; q->next->val+=1; } } return l1; } };