题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
代码:
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、花的时间很长,花了三天时间才做出来的。