兩個數字相加
題幹
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
解題**
/*畫圖分析* * definition for singly-linked list.
* struct listnode ; */
struct listnode* addtwonumbers(struct listnode* l1, struct listnode*l2)
if(t2!=null)
sum+=carry;
if(sum>=10
)
else
pnew->val=sum;
//將新的節點插入結果鍊錶
ptail->next=pnew;//
插入最新鍊錶的末尾
ptail=pnew;//
移動到尾節點
//向下遍歷鍊錶
if(t1!=null)//
不空才指向下乙個節點
if(t2!=null)
}struct listnode* temp2=h3->next;
free(h3);//
釋放空的頭結點
return temp2;//
返回鍊錶
}
思路分析
整體上來說,如圖所示一共有兩個鍊錶,其頭結點分別是l1和l2。每乙個鍊錶的節點順序是從頭結點對應數字的低位,而尾節點對應數字的高位。我們的目的是將將兩個鍊錶按位相加,考慮進製的情況,最終得到乙個新的鍊錶,這個鍊錶各個位對應兩個鍊錶對應數字相加的結果的各位結果。
如圖,l1從高位到低位是1984,而l2從高位到低位是52。兩個數字相加結果為2036,正好對應l3從高位到低位的2036.
然後我們分析一下過程,我們從低位到高位開始算,carry是進製。
* 0.初始進製為0,carray=0
* 4+2+carry=4+2+0=6 沒有進製 carry=0;
* 8+5+carry=8+5+0=13 進了一位 carry=1; 值為 13%10=3
* 9+0+carry=9+0+1=10 進了一位 carry=1; 值為10%10=0
* 1+0+carry=1+0+1=2 進製為0
**分析
1.為了盡可能簡單,我們將建立乙個新的鍊錶來儲存最終的結果,最後返回這個鍊錶的頭指標
2.在整個過程中不改變傳入的兩個鍊錶
3.我們需要同時遍歷兩個鍊錶
4.每次都要申請乙個新的節點
5.插入新的鍊錶,採用尾插法,這樣才能對應順序。
6.遍歷指標後移,只有在遍歷指標不為空的情況下才進行
jsp兩個數字相加 2 兩數相加
題目 給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0...
jsp兩個數字相加 leetcode 2 兩數相加
給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 ...
不用 實現兩個數相加
方法一 用邏輯運算 a b 表示a b 中每位不進製的和,a b 1 二進位制加法 1 1 1,把1左移以為10,1 1 10,表示a b 所有進製 思想是兩個數字相加中能分解成 不進製的和 每一位相加的進製 a b a b a b 1 如果a b 0的時候 a b a b 負整數運算也可以,因為補...