lc415-大数相加
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder sb=new StringBuilder();
char[] c1=num1.toCharArray();
char[] c2=num2.toCharArray();
int i=num1.length()-1;
int j=num2.length()-1;
int carry=0;
while(i>=0||j>=0||a!=0){
int m=i>=0?c1[i]-'0':0;
int n=j>=0?c2[j]-'0':0;
int result=m+n+carry;
sb.append(result%10);
carry=result/10;
i--;j--;
}
return sb.reverse().toString();
}
}
lc 大数相乘
利用了大数相加,很多细节需要注意:计算的时候从后往前,要在最开始加0;即使j超出位数了,进位的数不一定为0,所以要做一个判断
class Solution {
public String multiply(String num1, String num2) {
if(num1.equals("0")||num2.equals("0")) return "0";
char[] c1=num1.toCharArray();
char[] c2=num2.toCharArray();
int m=num1.length()-1;
int n=num2.length()-1;
int a=0;
String res="0";
for(int i=m;i>=0;i--){
StringBuilder sb=new StringBuilder();
int k=m-i;
while(k>0){
sb.append(0);
k--;
}
for(int j=n;j>=0||a!=0;j--){
int n1=c1[i]-'0';
int n2=j>=0?c2[j]-'0':0;
int ans=n1*n2+a;
sb.append(ans%10);
a=ans/10;
}
res=add(res,sb.reverse().toString());
}
return res;
}
String add(String n1,String n2){
char[] c1=n1.toCharArray();
char[] c2=n2.toCharArray();
int i=n1.length()-1;
int j=n2.length()-1;
int a=0;
StringBuilder sb=new StringBuilder();
while(i>=0||j>=0||a!=0){
int m=i>=0?c1[i]-'0':0;
int n=j>=0?c2[j]-'0':0;
int b=m+n+a;
sb.append(b%10);
a=b/10;
i--;j--;
}
return sb.reverse().toString();
}
}
lc2-两数相加(链表)
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//定义一个新链表伪指针,用来指向头指针,返回结果
ListNode prev = new ListNode(0);
//定义一个可移动的指针,用来指向存储两个数之和的位置
ListNode cur = prev;
int carry = 0;
while(l1 != null||l2 != null){
int n1 = l1==null?0:l1.val;
int n2 = l2==null?0:l2.val;
int sum = n1 + n2 + carry;
carry = sum / 10;
sum = sum % 10;
//创建个新节点,将值赋给节点
cur.next = new ListNode(sum);
//将链表的节点后移
cur = cur.next;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
//如果最后两个数相加还有进位,需要建新的节点
if(carry == 1) cur.next = new ListNode(carry);
return prev.next;
}
}