[LeetCode] 2. Add Two Numbers (medium)

Welcome To My Blog

2. Add Two Numbers (medium)

2.1.png
  1. 指針的用處:
    • 判斷是否到達(dá)鏈表結(jié)尾
    • 在一個(gè)已存在的鏈表上移動(dòng)指針,一定要先判斷當(dāng)前指針是否指向null
  2. 兩數(shù)相加,切記要加上進(jìn)位(0或1),從個(gè)位開始處理
  3. 10進(jìn)制加法,每一位的范圍是[0,9],進(jìn)位放到更高一位上.這是兩個(gè)約束
  4. Complexity analysis:
    • time complexity: O(max(link1,link2))
    • space complexity: O(max(link1,link2))
  5. 圖示如下,很直觀,用一個(gè)額外的ListNode作為結(jié)果鏈表的開始


    2.2.png
/**
 * 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) {
    //1. 這個(gè)節(jié)點(diǎn)作為結(jié)果鏈表的開始
    ListNode resHead = new ListNode(0); 
    //2. 指針
    ListNode p = l1, q = l2, curr = resHead;
    //3. 加法的進(jìn)位
    int carry = 0; 
    //4. 通過指針是否為空判斷是否遍歷完鏈表
    while(p != null || q!=null){ 
        //5. 如果p沒指向null則返回當(dāng)前ListNode的值,否則返回0
        int x = (p !=null)? p.val : 0; 
        int y = (q != null)? q.val : 0;
        //6. 加進(jìn)位! 加進(jìn)位! 加進(jìn)位!
        int sum = x+y+carry;//最開始誤寫成x+y,漏了carry
        carry = sum/10;  
        //7. 申請(qǐng)空間:存儲(chǔ)計(jì)算結(jié)果;指向下一個(gè)節(jié)點(diǎn)
        //7.1 約束:每一位的范圍是[0,9]!!!
        curr.next = new ListNode(sum%10); 
        curr = curr.next;
        //8. 不能直接移動(dòng)指針,可能會(huì)造成java.lang.NullPointerException,得加if判斷當(dāng)前p是不是null;指針可以指向空,但是空指針沒有.next
        if (p != null) p = p.next;
        if (q != null) q = q.next;
    }
    //9. 看看最后的兩個(gè)數(shù)相加的結(jié)果,如果還有進(jìn)位就得再建立個(gè)ListNode
    if (carry > 0) { 
        curr.next = new ListNode(carry);
    }
    return resHead.next;
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容