LeetCode刷題筆記_[2]兩數相加

  • language: java
  • knowledge: listNode

題目:

給你兩個 非空 的鏈表,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的,而且每一個節點只能存儲 一位 數字。java

請你將兩個數相加,並以相同形式返回一個表示和的鏈表。網絡

你能夠假設除了數字 0 以外,這兩個數都不會以 0 開頭。ide


示例 1:
this

輸入:l1 = [2,4,3], l2 = [5,6,4]
輸出:[7,0,8]
解釋:342 + 465 = 807.
示例 2:code

輸入:l1 = [0], l2 = [0]
輸出:[0]
示例 3:對象

輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
輸出:[8,9,9,9,0,0,0,1]blog

提示:leetcode

每一個鏈表中的節點數在範圍 [1, 100] 內
0 <= Node.val <= 9
題目數據保證列表表示的數字不含前導零it

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/add-two-numbers
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。io

思路一

  1. 提供的鏈表範圍爲[1, 100],則最少會有一個節點,新建一個head鏈表用於保存結果,則第一個節點的值爲l1.val + l2.val。

  2. 建立一個cur引用head鏈表,用於操做head鏈表(若直接使用head,則會輸出head最後節點)

  3. 使用一個while循環遍歷鏈表,判斷條件爲l一、l2兩鏈表的下一節點都不爲空while(l1.next != null || l2.next != null)。

  4. 判斷兩鏈表的下一節點是否爲空,若不爲空則將當前節點後移,若爲空則將當前直爲空節點:l1 = l1.next != null ? l1.next : new ListNode;

  5. 兩鏈表的節點值之和可能會大於9,此時則會向後產生一個進位(鏈表節點值範圍[0, 9],節點值和範圍爲[0, 18])。故cur的下一個節點值爲l1.val + l2.val + cur.val / 10)。

  6. 此時,cur的下一個節點的值已經肯定,但cur當前節點的值可能不合規範([0, 9]),因此要對cur取餘:cur.val %= 10。(由於cur不必定會大於10,因此不可以使用-10來計算當前節點應存儲的值。

  7. 將cur移向下一個節點。

  8. 當while循環結束,表明兩個鏈表都已遍歷完畢,以下:

此時,cur的最後一個節點仍可能大於9,好比l1和l2都是單節點鏈表,那麼就不會進入while循環,而計算以後獲得cur.val = 10,不合規範,須要執行一次五、6。

代碼以下:

class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}
class Solution {
   public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
      ListNode head = new ListNode(l1.val + l2.val);
      ListNode cur = head;
      while (l1.next != null || l2.next != null) {
            l1 = l1.next != null ? l1.next : new ListNode();
            l2 = l2.next != null ? l2.next : new ListNode();
            cur.next = new ListNode(l1.val + l2.val + cur.val / 10);
            cur.val %= 10;
            cur = cur.next;
      }
      if (cur.val >= 10) {
            cur.next = new ListNode(cur.val / 10);
            cur.val %= 10;
      }
      return head;
   }
}

思路二

  1. 首先按照鏈表順序依次相加,結果都賦給l1,若是大於9就向下位進1,直到有一方鏈表到達末尾。
  2. 判斷l2結果是否非空,若是不爲空則說明l2更長,就把l2接續到l1末端,而後判斷l1剩餘元素是否仍有可能發生進位。
  3. 當完成前n位的計算後,判斷cur.val是否大於9,是就須要新建一個節點存儲最高位進位值,最後返回對l1的引用對象。

此方法因爲沒有新建鏈表,只是對l1進行引用、操做,故空間複雜度爲O(1),時間複雜度爲O(max(l1, l2))。