题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解法1
//直接计算法
public class P2_AddTowNumbers {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
long sum1=0,sum2=0,sum=0;
int index1 = 0,index2 = 0;
while (l1 != null){
sum1 += l1.val* Math.pow(10,index1);
index1++;
l1 = l1.next;
}
while (l2 != null){
sum2 += l2.val* Math.pow(10,index2);
index2++;
l2 = l2.next;
}
sum = sum1 + sum2;
ListNode head = new ListNode((int)(sum%10));
// sum = sum / 10;
ListNode l = head;
while (sum/10 != 0){
sum = sum / 10;
ListNode li = new ListNode((int)(sum%10));
l.next = li;
l = li;
}
// l.next = new ListNode(sum);
return head;
}
public static void main(String[] args){
ListNode l1 = new ListNode(9);
// l1.next = new ListNode(8);
ListNode l2 = new ListNode(1);
ListNode p2 = l2;
for(int i = 0;i<9;i++){
p2.next = new ListNode(9);
p2 = p2.next;
}
// l2.next = new ListNode(8);
ListNode l3 = new P2_AddTowNumbers().addTwoNumbers(l1,l2);
while (l3!= null){
System.out.print(""+l3.val+"->");
l3 = l3.next;
}
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
这种解法有一个局限性,就是超出long表示范围的数据相加计算就无法正确显示了,如下图
当然这也怪题目没有说清楚范围好吧,看到这个输入值,就知道这种方法来做行不通了。
解法2
public class P2_AddTowNumbers2 {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode p = head;
int rest = 0;
while (l1 != null || l2 !=null){
int val1 = 0,val2 = 0;
if(l1!=null){
val1 = l1.val;
l1 = l1.next;
}
if(l2!=null){
val2 = l2.val;
l2 = l2.next;
}
ListNode pi = new ListNode((val1+val2+rest)%10);
rest = (val1+val2+rest)/10;
p.next = pi;
p = pi;
}
if(rest != 0 ){
p.next = new ListNode(rest);
}
return head.next;
}
public static void main(String[] args){
ListNode l1 = new ListNode(5);
// ListNode l11 = l1.next = new P2.ListNode(4);
// l11.next = new P2.ListNode(3);
ListNode l2 = new ListNode(5);
// ListNode p2 = l2;
// for(int i = 0;i<9;i++){
// p2.next = new ListNode(9);
// p2 = p2.next;
// }
// ListNode l22 = l2.next = new P2.ListNode(6);
// l22.next = new P2.ListNode(4);
P2_AddTowNumbers2 calc = new P2_AddTowNumbers2();
ListNode l3 = calc.addTwoNumbers(l1,l2);
while (l3!= null){
System.out.print(""+l3.val+"->");
l3 = l3.next;
}
}
}
这种解法就解决了java中基本变量类型表示的限制,根据最基本的加法运算,按位相加,逢十进一。
其中rest为每次相加的进位,(val1+val2+rest)%10为本次加法运算完成之后该位上的结果,紧接着计算下一次是否有进位rest = (val1+val2+rest)/10。