算法1:兩數(shù)之和問題

題目:

給出兩個(gè)?非空 的鏈表用來表示兩個(gè)非負(fù)的整數(shù)庐镐。其中,它們各自的位數(shù)是按照?逆序?的方式存儲的倾鲫,并且它們的每個(gè)節(jié)點(diǎn)只能存儲?一位?數(shù)字。

如果萍嬉,我們將這兩個(gè)數(shù)相加起來乌昔,則會返回一個(gè)新的鏈表來表示它們的和。

您可以假設(shè)除了數(shù)字 0 之外壤追,這兩個(gè)數(shù)都不會以 0?開頭磕道。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

輸出:7 -> 0 -> 8

原因:342 + 465 = 807


結(jié)題方法:初等數(shù)學(xué)

思路

我們使用變量來跟蹤進(jìn)位,并從包含最低有效位的表頭開始模擬逐位相加的過程行冰。

算法實(shí)現(xiàn):

就像你在紙上計(jì)算兩個(gè)數(shù)字的和那樣溺蕉,我們首先從最低有效位也就是列表 l1l1 和 l2l2 的表頭開始相加。由于每位數(shù)字都應(yīng)當(dāng)處于 0 \ldots 90…9 的范圍內(nèi)悼做,我們計(jì)算兩個(gè)數(shù)字的和時(shí)可能會出現(xiàn) “溢出”疯特。例如,5 + 7 = 125+7=12肛走。在這種情況下漓雅,我們會將當(dāng)前位的數(shù)值設(shè)置為 22,并將進(jìn)位 carry = 1carry=1 帶入下一次迭代朽色。進(jìn)位 carrycarry 必定是 00 或 11邻吞,這是因?yàn)閮蓚€(gè)數(shù)字相加(考慮到進(jìn)位)可能出現(xiàn)的最大和為 9 + 9 + 1 = 199+9+1=19。

偽代碼如下:

將當(dāng)前結(jié)點(diǎn)初始化為返回列表的啞結(jié)點(diǎn)葫男。

將進(jìn)位 carrycarry 初始化為 00抱冷。

將 pp 和 qq 分別初始化為列表 l1l1 和 l2l2 的頭部。

遍歷列表 l1l1 和 l2l2 直至到達(dá)它們的尾端腾誉。

將 xx 設(shè)為結(jié)點(diǎn) pp 的值徘层。如果 pp 已經(jīng)到達(dá) l1l1 的末尾,則將其值設(shè)置為 00利职。

將 yy 設(shè)為結(jié)點(diǎn) qq 的值趣效。如果 qq 已經(jīng)到達(dá) l2l2 的末尾,則將其值設(shè)置為 00猪贪。

設(shè)定 sum = x + y + carrysum=x+y+carry跷敬。

更新進(jìn)位的值,carry = sum / 10carry=sum/10热押。

創(chuàng)建一個(gè)數(shù)值為 (sum \bmod 10)(summod10) 的新結(jié)點(diǎn)西傀,并將其設(shè)置為當(dāng)前結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)斤寇,然后將當(dāng)前結(jié)點(diǎn)前進(jìn)到下一個(gè)結(jié)點(diǎn)。

同時(shí)拥褂,將 pp 和 qq 前進(jìn)到下一個(gè)結(jié)點(diǎn)娘锁。

檢查 carry = 1carry=1 是否成立,如果成立饺鹃,則向返回列表追加一個(gè)含有數(shù)字 11 的新結(jié)點(diǎn)莫秆。

返回啞結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)。

請注意悔详,我們使用啞結(jié)點(diǎn)來簡化代碼镊屎。如果沒有啞結(jié)點(diǎn),則必須編寫額外的條件語句來初始化表頭的值茄螃。


測試用例


官方解答:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

? ? ListNode dummyHead = new ListNode(0);

? ? ListNode p = l1, q = l2, curr = dummyHead;

? ? int carry = 0;

? ? while (p != null || q != null) {

? ? ? ? int x = (p != null) ? p.val : 0;

? ? ? ? int y = (q != null) ? q.val : 0;

? ? ? ? int sum = carry + x + y;

? ? ? ? carry = sum / 10;

? ? ? ? curr.next = new ListNode(sum % 10);

? ? ? ? curr = curr.next;

? ? ? ? if (p != null) p = p.next;

? ? ? ? if (q != null) q = q.next;

? ? }

? ? if (carry > 0) {

? ? ? ? curr.next = new ListNode(carry);

? ? }

? ? return dummyHead.next;

}


個(gè)人題解:

/**

* 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) {

? ? ? ? ListNode p = l1;

? ? ? ? ListNode q = l2;

? ? ? ? int addNum = 0;

? ? ? ? while(q!=null){

? ? ? ? ? ? if(p.next==null && q.next!=null)

? ? ? ? ? ? ? ? p.next = new ListNode(0);

? ? ? ? ? ? if(q.next==null && p.next!=null)

? ? ? ? ? ? ? ? q.next = new ListNode(0);

? ? ? ? ? ? int sumAll = addNum + p.val + q.val;

? ? ? ? ? ? p.val = sumAll % 10;

? ? ? ? ? ? addNum = sumAll / 10;

? ? ? ? ? ? if(p.next == null && q.next == null && addNum!=0)

? ? ? ? ? ? ? ? p.next = new ListNode(addNum);

? ? ? ? ? ? p = p.next;

? ? ? ? ? ? q = q.next;

? ? ? ? }

? ? ? ? return l1;

? ? }

}

轉(zhuǎn)載自:力扣(LeetCode)

鏈接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缝驳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖抵栈,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異齿拂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肴敛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門署海,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人医男,你說我怎么就攤上這事砸狞。” “怎么了镀梭?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵刀森,是天一觀的道長。 經(jīng)常有香客問我报账,道長研底,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任透罢,我火速辦了婚禮榜晦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羽圃。我一直安慰自己乾胶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著识窿,像睡著了一般斩郎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喻频,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天缩宜,我揣著相機(jī)與錄音,去河邊找鬼半抱。 笑死脓恕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窿侈。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼秋茫,長吁一口氣:“原來是場噩夢啊……” “哼史简!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肛著,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤圆兵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后枢贿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殉农,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年局荚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了超凳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耀态,死狀恐怖轮傍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情首装,我是刑警寧澤创夜,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站仙逻,受9級特大地震影響驰吓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜系奉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一檬贰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喜最,春花似錦偎蘸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽限书。三九已至,卻和暖如春章咧,著一層夾襖步出監(jiān)牢的瞬間倦西,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工赁严, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扰柠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓疼约,卻偏偏與公主長得像卤档,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子程剥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容