1. 程式人生 > >2018/12/14日:兩數之和

2018/12/14日:兩數之和

(1)給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

輸出:7 -> 0 -> 8

原因:342 + 465 = 807

 

解題思路:遍歷連結串列依次相加(遍歷連結串列利用非空,.next進行指標移動)

注意問題:(1)連結串列為空的時候,數值為0 (2)carry數值是/不是取餘,10+9=19,表示的進位,sum代表的數值的個位需要取餘運算(3)當連結串列長度不一樣的時候,最後可能發生進位。1+9=10的情況;

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//         建立一個ListNode用來返回和的連結串列
       ListNode head = new ListNode(0);
        //p->l1連結串列的頭部,代表連結串列的index 表示連結串列的實時位置
       ListNode p = l1 , q = l2,current = head;
       int carry = 0; //代表進位的位數;
        //遍歷連結串列,由於連結串列的長度不確定,所以||確定每個連結串列都可以遍歷萬,避免連結串列長度不一致;
       while(p!=null || q!=null){
           //不為空的時候取出連結串列的數值,當連結串列到達底部的時候有一個連結串列可能為空,數值為0;
           int x = (p!=null)?p.val:0;
           int y = (p!=null)?p.val:0;
           int sum = 0; //初始化和為0
           sum = (x+y+carry)%10; //sum的和等於兩數的和, 7+8 = 15 只留下5 其餘的進位
           carry = (x+y)/10; //carry和放在後面更新,首次的時候carry數值為0,15/10=1.5 進位進1,10+9=19/10 =1,9/10=0;
           current.next = new ListNode(sum); //sum數值存入到連結串列裡面,
           current= current.next;
           //指標指向下一個位置
           if(p!=null) p = p.next;
           if(q!=null) q = q.next;
           
           
       }  
        //遍歷萬的數值;
      if (carry > 0) { //考慮最後連結串列遍歷玩還有數值的情況
        current.next = new ListNode(carry);
     }
        return head.next;
    }
}