19.9.23 两数相加 中等


题目:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 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、花的时间很长,花了三天时间才做出来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值