天天看點

Leecode add-two-numbers題目描述分析java代碼

題目描述

給定兩個代表非負數的連結清單,數字在連結清單中是反向存儲的(連結清單頭結點處的數字是個位數,第二個結點上的數字是百位數…),求這個兩個數的和,結果也用連結清單表示。

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

輸出: 7 -> 0 -> 8

分析

應遵循加法規則,從低位向高位相加,如果有進位要考慮進位。還要考慮連結清單長度問題。設定指針p1,p2分别指向兩個連結清單,第一個while循環,把他們公共的位相加,每位相加的時候都考慮低位的進位,以及向上的進位,這樣可以把兩個連結清單的公共位相加。之後的兩個while循環:while(p1 != null)和while(p2 != null)最多隻執行一個,這樣把長度長的連結清單也加上了。最後一個if,考慮最後一位是否還有進位。

java代碼

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode p1 = l1;
        ListNode p2 = l2;
        
       ListNode head = new ListNode(0);
       ListNode p = head;
        int carry = 0;
        int sum = 0;
         int local = 0;
        while(p1 != null && p2 != null){
             sum = p1.val + p2.val + carry;
             local = sum%10;
            
            p.next = new ListNode(local);
            p = p.next;
            
            carry = sum/10;
           p1 = p1.next;
           p2 = p2.next;
        }
        while(p1 != null){
            sum = p1.val + carry;
            local = sum%10;
            //p1.val = local;
            p.next = new ListNode(local);
            p = p.next;
            
            carry = sum/10;
           p1 = p1.next;
        }
        
         while(p2 != null){
            sum = p2.val + carry;
            local = sum%10;
            //p1.val = local;
            p.next = new ListNode(local);
            p = p.next;
            
            carry = sum/10;
           p2 = p2.next;
        }
        
        if(carry > 0){
             p.next = new ListNode(carry);
        }
        
        return head.next;
        
        
    }
}