两数相加十进制两数相加概述二进制两数相加链表两数相加解题思路如果你写过大数相加(字符串相加),你可能会这样写varaddBinary=function(a,b){letmaxLen=Math.max(a.length,b.length)a=a.padStart(maxLen,'0')b=b.padStart(maxLen,'0')letflag=0letres=''leti=maxLen-1while(i>=0){flag=Number(a[i])+Number(b[i])+flagres=flag%10+res;flag=Math.floor(flag/10)i--}res=flag==1?'1'+res:resreturnres}如果改成二进制呢?这是好的代码吗/***@param{string}a*@param{string}b*@return{string}*/varaddBinary=function(a,b){letmaxLen=Math.max(a.length,b.length)a=a.padStart(maxLen,'0')b=b.padStart(maxLen,'0')letflag=0letres=''leti=maxLen-1while(i>=0){flag=Number(a[i])+Number(b[i])+flagres=flag%2+res;flag=Math.floor(flag/2)i--}res=flag==1?'1'+res:res返回res};细心的朋友已经看出端倪了,就是remainder和carry都变了,其他的都没有动,所以于是总结了一个N元加法的通用方法/***@param{string}a*@param{string}b*@param{number}基数*@return{string}*/varaddBinary=function(a,b,radix){letmaxLen=Math.max(a.length,b.length)a=a.padStart(maxLen,'0')b=b.padStart(maxLen,'0')让标志=0letres=''leti=maxLen-1while(i>=0){flag=Number(a[i])+Number(b[i])+flagres=flag%radix+res;flag=Math.floor(flag/radix)i--}res=flag==1?'1'+res:res返回res};另一个字符串加法/***@param{string}num1*@param{string}num2*@return{string}*/varaddStrings=function(a,b){letl1=a.length-1letl2=b.length-1letflag=0letres=''while(l1>=0||l2>=0){letx=l1>=0?+a[l1]:0让y=l2>=0?+b[l2]:0flag=x+y+flagres=flag%10+res;标志=数学。floor(flag/10)l1--l2--}res=旗帜==1?'1'+res:resreturnres};链表式两数相加/***单链表定义。*functionListNode(val,next){*this.val=(val===undefined?0:val)*this.next=(next===undefined?null:next)*}*//***@param{ListNode}l1*@param{ListNode}l2*@return{ListNode}*/varaddTwoNumbers=function(l1,l2){letdummy=newListNode()letcur=dummy;让flag=0while(l1||l2){让n1=l1&&l1.val||0让n2=l2&&l2.val||0让total=n1+n2+flagcur.next=newListNode(total%10)cur=cur.nextl1=l1&&l1.nextl2=l2&&l2.nextflag=Math.floor(total/10)}if(flag){cur.next=newListNode(flag)}returndummy.next};
