兩個數字相加

2022-06-30 13:27:14 字數 1699 閱讀 1709

兩個數字相加

題幹

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。

如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。

您可以假設除了數字 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 負整數運算也可以,因為補...