leetcode-2-Add Two Numbers

题目:Add Two Numbers

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Example

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.


思路:一开始觉得这题不难,不就是直接将两个链表的数都取出来求和,然后再构造一个新链表将每一位再插回去,写出如下代码
 1 package leetcodeTest;
 2 import java.util.*;
 3 public class addTwoNumbersClass {
 4     public static void main(String[]args){
 5     int []a={9};
 6     int[]b={1,9,9,9,9,9,9,9,9,9};
 7     ListNode l1=creatList(a);
 8     ListNode l2=creatList(b);
 9       ListNode l=  addTwoNumbers( l1, l2);
10       while(l!=null){
11           System.out.println(l.val);
12           l=l.next;
13       }
14     }
15 
16     public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
17         if(l1==null&&l2==null) return null;
18         int a=0;
19         long sum1=l1.val,sum2=l2.val,sum=0;
20         int m=0,n=0;//m,n代表L1,L2的长度
21         int b=0;
22         while(l1!=null){
23             sum1+=a*(long)(Math.pow(10,m));
24             l1=l1.next;
25             m++;
26             if(l1==null)break;
27             a=l1.val;
28         }
29         while(l2!=null){
30             sum2+=b*((long)(Math.pow(10,n)));
31             l2=l2.next;
32             n++;
33             if(l2==null)break;
34             b=l2.val;
35         }
36         ListNode s = new ListNode(0);
37         ListNode r=s;
38         sum=sum1+sum2;
39         if(sum==0)return new ListNode(0);
40         while(sum!=0) {
41             int p = (int) (sum % 10);
42             ListNode t=new ListNode(p);
43             s.next = t;
44             s = s.next;
45             sum = sum / 10;
46         }
47         return r.next;
48     }
49 
50 public static ListNode creatList(int[] x){
51         //创建链表
52     ListNode q = new ListNode(0);
53     ListNode w=q;
54     for(int i=0;i<x.length;i++) {
55         ListNode p = new ListNode(x[i]);
56         q.next = p;
57         q=q.next;
58     }
59     return  w.next;
60 }
61 
62 
63 
64 
65     public static class ListNode {
66         int val;
67         ListNode next;
68     ListNode(int x) { val = x; }
69   }
70 }

然而我还是太年轻了,就算用上了long整形,测试数据的链表长度直接达到了60多位后,如果直接转化成数求和的话,long 也不够用这就说明思路不对

再仔细观察一下,发现其就是一个简单的向右进位问题,取两链表的当前位直接相加,若无进位就直接将其放入新链表节点中,若有进位则将需要进位的数加入到下一位相加的数中,然后取10的余放入当前位的链表节点中,然后就行了。Your runtime beats 87.03 % of java submissions

 1 package leetcodeTest;
 2 import java.util.*;
 3 public class addTwoNumbersClass {
 4     public static void main(String[]args){
 5     int []a={2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,9};
 6     int[]b={5,6,4,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,2,4,3,9,9,9,9};
 7 
 8     ListNode l1=creatList(a);
 9     ListNode l2=creatList(b);
10       ListNode l=  addTwoNumbers( l1, l2);
11       while(l!=null){
12           System.out.println(l.val);
13           l=l.next;
14       }
15     }
16 
17     public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
18         if(l1==null&&l2==null) return null;
19         ListNode s = new ListNode(0);
20         ListNode r=s;
21         int m=0;
22         while(l1!=null&&l2!=null){
23             int a=l1.val;
24             int b=l2.val;
25             int sum=a+b+m;
26             m=sum/10;//向右进位的数
27             int n=sum%10;//当前位
28             ListNode t=new ListNode(n);
29             s.next=t;
30             l1=l1.next;
31             l2=l2.next;
32             s=s.next;
33         }
34         while(l1==null&&l2!=null){
35             int b=l2.val;
36             int sum=b+m;
37             m=sum/10;
38             int n=sum%10;
39             ListNode t=new ListNode(n);
40             s.next=t;
41             l2=l2.next;
42             s=s.next;
43         }
44         while(l1!=null&&l2==null){
45             int a=l1.val;
46             int sum=a+m;
47             m=sum/10;
48             int n=sum%10;
49             ListNode t=new ListNode(n);
50             s.next=t;
51             l1=l1.next;
52             s=s.next;
53         }
54         if(m!=0){
//若l1,l2都为空时还有进位,则需要将该进位新加入链表中
55 ListNode t=new ListNode(m); 56 s.next=t; 57 } 58 return r.next; 59 } 60 61 public static ListNode creatList(int[] x){ 62 //创建链表 63 ListNode q = new ListNode(0); 64 ListNode w=q; 65 for(int i=0;i<x.length;i++) { 66 ListNode p = new ListNode(x[i]); 67 q.next = p; 68 q=q.next; 69 } 70 return w.next; 71 } 72 73 74 75 76 public static class ListNode { 77 int val; 78 ListNode next; 79 ListNode(int x) { val = x; } 80 } 81 }

 ac后,学习了一下排名前面的代码,可以看这个代码,它通过将l1或l2为null后将其值直接赋0,免去了我的代码当中对l1==null和l2==null时的分开讨论,写的很简洁,很巧妙!

 1 class Solution {
 2     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
 3         ListNode l3 = new ListNode(0);
 4         ListNode p = l1, q = l2, current = l3;
 5         int carry = 0;
 6         while (p != null || q != null) {
 7             int x = (p == null) ? 0 : p.val;
 8             int y = (q == null) ? 0 : q.val;
 9             int sum = x + y + carry;
10             carry = sum/10;
11             current.next = new ListNode(sum%10);
12             current = current.next;
13             if(p!=null) p = p.next;
14             if(q!=null) q = q.next;
15         }
16         if (carry > 0) {
17             current.next = new ListNode(carry);
18             current = current.next;
19         }
20         return l3.next;
21     }
22 }
原文地址:https://www.cnblogs.com/pathjh/p/9093592.html