题目:

代码:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 class Solution {
10     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
11         int r1 = 0;
12         int r2 = 0;
13         int r3 = 0;
14         ListNode result = new ListNode(0);
15         ListNode curr = result;
16         while(l1 != null || l2 != null || r3 != 0){
17
18             if(l1 != null){
19                 r1 = l1.val;
20                 l1 = l1.next;
21             }
22             else r1 = 0;
23
24             if(l2 != null){
25                 r2 = l2.val;
26                 l2 = l2.next;
27             }
28             else r2 = 0;
29
30             r3 = r1 + r2 + r3;
31
32             curr.next = new ListNode(r3 % 10);
33             curr = curr.next;
34
35             r3 /= 10;
36         }
37
38         return result.next;
39     }
40 }

心得:

1、第一次做中等的题目,怀揣了害怕的心情哈哈;

2、自己一开始的思路是分别将两个栈中元素一个个弹出然后存起来,再相加后存进一个新的栈里输出,然后粗略的查看题解感觉差不多,就按照这个思路做了;

代码也贴出来:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 class Solution {
10     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
11         BigInteger r1 = 0;
12         BigInteger r2 = 0;
13         ListNode result = new ListNode(0);
14         ListNode curr = result;
15
16         int i = 0;
17         while(l1 != null){
18             r1 = r1 + (l1.val * (int)Math.pow(10, i));
19             i++;
20             l1 = l1.next;
21             System.out.println(r1);
22         }
23
24
25         i = 0;
26         while(l2 != null){
27             r2 = r2 + (l2.val * (long)Math.pow(10, i));
28             i++;
29             l2 = l2.next;
30         }
31
32         BigInteger r3 = r1 + r2;
33
34         if(r3 == 0){
35             curr.next = new ListNode(0);
36             return result.next;
37         }
38
39         while(r3 != 0 && curr != null){
40             BigInteger c = r3 % 10;
41             curr.next = new ListNode((int)c);
42             curr = curr.next;
43             r3 /= 10;
44         }
45         return result.next;
46     }
47 }

3、先是纠结了l1和l2有没有头结点,尝试后发现没有,也在尝试的过程中逐步摸清java中的栈的使用方法;

4、本来r1、r2和r3都是int类型的,分别用来存储l1、l2和相加结果,但是运行的时候发现越界了,然后改为long,还是会越界,打算改成BigInteger时发现不好用就在考虑是不是方法做错了;

5、最后一步相加结果压入栈中也是看题解才知道怎么做的,要另外用一个curr来压入result,最后的return就不太懂了,应该是这道题自己写的return会逐步return每一个数;

6、继4,还是不得不看了题解,大概了解了它的思路:就是两个栈一边弹出就一边相加压入新的栈里,然后有进位的话就把1保存下来,下个循环加上,不会有进位2;

7、花的时间很长,花了三天时间才做出来的。

02-11 12:04