题目简析
两个数存储在链表中,倒序排列的,分别相加,返回一个链表
算法详情:Add Two Numbers
这道题的考察有两点:
我的实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if(l1==null&&l2==null){ return l1; } if(l1==null){ return l2; } if(l2==null){ return l1; } int rest=0; ListNode result=null; boolean firstNode=false; ListNode resultHeader=null; ListNode resultPointer=null; int value=0; while(l1!=null&&l2!=null){ value=l1.val+l2.val+rest; rest=value>9?1:0; value=value%10; result=new ListNode(value); if(!firstNode){ resultHeader=result; resultPointer=resultHeader; firstNode=true; }else{ resultPointer.next=result; resultPointer=result; } l1=l1.next; l2=l2.next; } if(l1!=null||l2!=null){ if(l2==null){ while(l1!=null){ result=new ListNode(0); value=l1.val+rest; rest=value>9?1:0; value=value%10; l1=l1.next; result.val=value; resultPointer.next=result; resultPointer=result; } }else{ while(l2!=null){ result=new ListNode(0); value=l2.val+rest; rest=value>9?1:0; value=value%10; l2=l2.next; result.val=value; resultPointer.next=result; resultPointer=result; } } } if(rest!=0){ result=new ListNode(rest); resultPointer.next=result; } return resultHeader; } }
|
参考答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode(0); ListNode p = l1, q = l2, curr = dummyHead; int carry = 0; while (p != null || q != null) { int x = (p != null) ? p.val : 0; int y = (q != null) ? q.val : 0; int sum = carry + x + y; carry = sum / 10; curr.next = new ListNode(sum % 10); curr = curr.next; if (p != null) p = p.next; if (q != null) q = q.next; } if (carry > 0) { curr.next = new ListNode(carry); } return dummyHead.next; }
|
分析
- 解题思路差不多,但是处理细节上,参考答案处理上更好一些。
- 链表长短不一致时,循环的处理,都放在一起处理,而我的分开处理了。导致代码有点冗余了
- 参考答案,设置了一个空Node,返回数据时,返回这个Node的next即可。避免了我在循环内部设置变量,用来控制对头结点的处理。