簡單的兩數之和再次亂入<< Add Two Numbers >>


請看題目描述

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

 

 1//Definition for singly-linked list.
 2     class ListNode
3 {
4 public int val;
5 public ListNode next;
6 public ListNode(int x)
7 {
8 val = x;
9 }
10 } 

 

 分析:
  這個兩數相加不難,只是兩個正整數都放在了鏈表里面了而已。還有一點是,整數的每一位數字都是放過來存放的,那么這樣就明顯降低了難度了,實現起來就像我們小學的時候列樹式計算兩個數的和,從低位加起,和與10的余數放在本位,和與10的商產生高位進位。在本題只需從兩個鏈表的表頭開始相加,用一個存放計算結果的鏈表的對應位置存放兩個鏈表對應位置的整數和進位和除以10的余數,並用臨時變量存放進位,用於加入下一次的兩個整數之和中。直到兩個鏈表中長的鏈表也遍歷完了,那么結果鏈表也就出來了。結果鏈表的整數的各位數字也是反序的。

  從前面的分析來看我們可以使用遞歸和非遞歸兩種算法實現。
  C#參考實現如下:  
 遞歸實現:
 1        public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
2 {
3 return AddTwoNumbers(l1, l2, 0);
4 }
5 public ListNode AddTwoNumbers(ListNode l1, ListNode l2 , int carry)
6 {
7 if(l1 == null && l2 == null && carry ==0)
8 {
9 return null;
10 }
11 ListNode result = new ListNode(0);
12 int sum = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + carry;
13 result.val = sum % 10;
14 ListNode more = AddTwoNumbers( l1 == null ? null : l1.next ,
15 l2 == null ? null :l2.next,
16 sum >= 10 ? 1 : 0 );
17 result.next = more;
18 return result;
19 }
 
非遞歸實現:
 1  public ListNode AddTwoNumbers2(ListNode l1, ListNode l2)
2 {
3 ListNode node = new ListNode(0);
4 ListNode result = node;
5
6 int carry = 0;
7 while(l1 != null || l2 != null || carry != 0)
8 {
9 int sum =( l1 ==null ? 0 : l1.val )+( l2 == null ? 0 : l2.val )+ carry;
10 l1 =( l1 ==null ? null : l1.next);
11 l2 =( l2 == null ? null : l2.next);
12
13 node.next = new ListNode(sum % 10 );
14 node = node.next;
15
16 carry = sum / 10;
17 }
18 return result.next;
19 }
 
 總結:這個題目不難只要靜下心來就可以想出來,涉及的細節問題也不多。那么如果把題目改一下,改成兩個鏈表中存放正整數的每一位數字是正向存放的,又該如何實現呢?注意:鏈表是單向的。這時就要注意兩個整數的位數長短了。我們可以這樣實現:a)先比較兩個鏈表的長度並用零填充較短的鏈表 b)遞歸結果加到首部
  

 

                               


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com