【每天一題】Leetcode-2兩數相加

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

題目解法:
主要難點在於涉及到對鏈表的處理,首先這是一個linded List,對於鏈表,
有以下特點

  • 每個鏈表只能控制頭節點
  • 如果想要找到其中某個節點,只能從頭節點head開始,一個一個的向後推移,直到找到某個節點。
  • 如果想要刪除某個節點,只能先找到那個節點,然後把該節點的前一個節點的指針指向該節點的後一個節點

本題看起來就是兩個數相加,很多人第一首先想到可不可以把每個鏈表的數都取出來,然後存到int,然後相加,加出的結果再倒序存回到鏈表,我最初就是這樣解的,但會出現很多問題:比如說時間超限,數據溢出等,因爲你根本不知道最後兩數相加到底有多大,這樣做是非常不安全的。這種方法對於超過int取值範圍到大數是不行的。我是先轉化成vector,然後進行相加處理。leetcode提示“內存超過限制”的錯誤。

在這裏插入圖片描述
就像你在紙上計算兩個數字的和那樣,我們首先從最低有效位也就是列表 l1 和 l2 的表頭開始相加。由於每位數字都應當處於 0…9 的範圍內,我們計算兩個數字的和時可能會出現 “溢出”。例如,5 + 7 =12。在這種情況下,我們會將當前位的數值設置爲 2,並將進位 carry = 1入下一次迭代。進位 carry 必定是 0 或 1,這是因爲兩個數字相加(考慮到進位)可能出現的最大和爲 9 + 9 + 1 =19。

下面是程序的代碼:

class Solution {
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    	//如果l1,l2爲空
        if(l1==null && l2==null) 
            return null;
        //將當前結點初始化爲返回列表的啞結點。
        ListNode dummy=new ListNode(0);
        ListNode head=dummy;
        int carry=0;//進位數
        while(l1!=null||l2!=null||carry!=0){
        	//如果已經到達 l1的末尾,則將其值設置爲 00。
            int val1=l1==null?0:l1.val;
            int val2=l2==null?0:l2.val;
            int sum=val1+val2+carry;
            //更新進位的值
            carry=sum/10;
            //創建一個數值爲 (sum %10)】的新結點,
            head.next=new ListNode(sum%10);
            // 並將其設置爲當前結點的下一個結點,然後將當前結點前進到下一個結點。
            head=head.next;
            //同時,將 l1 和 l2 前進到下一個結點。
            if(l1!=null) l1=l1.next;
            if(l2!=null) l2=l2.next;
        }
        return dummy.next;
    }
}

在這裏插入圖片描述
複雜度分析

時間複雜度:O(max(m,n)),假設 m 和 n 分別表示 l1和 l2的長度,上面的算法最多重複max(m,n) 次。

空間複雜度:O(max(m,n)), 新列表的長度最多爲 max(m,n)+1。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章