题目:
代码:
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、花的时间很长,花了三天时间才做出来的。