Add Two Numbers I画恰、II

Add Two Numbers I

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

思路

  1. 從同時(shí)從2個(gè)linkedlist頭部開始遍歷餐屎,算2個(gè)數(shù)的和徐块。
  2. 怎么算此洲?sum = (l1.val + l2.val + carry) % 10, carry = (l1.val + l2.val) / 10
  3. 不要忘了畅厢,l1和l2的長(zhǎng)度可能不等番宁,所以當(dāng)某一個(gè)已經(jīng)遍歷完以后元莫,還需要把剩下的那個(gè)遍歷完。
  4. 最后不要忘了最后一個(gè)可能出現(xiàn)的carry蝶押。比如999 + 99 => 9->8->0->(1) 但是踱蠢,如果carry是0時(shí)就不需要加了。
/**
 * 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) {
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        }
        
        int carry = 0;
        ListNode dummy = new ListNode(0);
        ListNode head = dummy;
      //  Queue<ListNode> queue = new LinkedList<ListNode>();
        
        while (l1 != null && l2 != null) {
            int sum = l1.val + l2.val + carry;
            int cur = sum % 10;
            carry = sum / 10;
            head.next = new ListNode(cur);
            head = head.next;
            l1 = l1.next;
            l2 = l2.next;
        }
        
        while (l1 != null) {
            int sum = l1.val + carry;
            int cur = sum % 10;
            carry = sum / 10;
            head.next = new ListNode(cur);
            head = head.next;
            l1 = l1.next;
        }
        
        while (l2 != null) {
            int sum = l2.val + carry;
            int cur = sum % 10;
            carry = sum / 10;
            head.next = new ListNode(cur);
            head = head.next;
            l2 = l2.next;
        }
        
        if (carry != 0) {
            head.next = new ListNode(carry);
        }
        
        return dummy.next;
    }
}

Add Two Numbers II

You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.

Example:

Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7

思路

  1. 不能翻轉(zhuǎn)listNode的情況下棋电,就只能借助外部結(jié)構(gòu)來(lái)實(shí)現(xiàn)翻轉(zhuǎn)linkedList了茎截,那么可以用FILO的STACK來(lái)分別存儲(chǔ)L1和L2
  2. 同時(shí)從q1/q2中取出節(jié)點(diǎn),算2者相加的結(jié)果(邏輯與Add Two Numbers一致)赶盔,算好的結(jié)果仍然放入到第三個(gè)STACK結(jié)構(gòu)中
  3. 從存結(jié)果的stack中依次取出結(jié)果的每個(gè)節(jié)點(diǎn)企锌,并組織成LinkedList。
/**
 * 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) {
        //1. 不能翻轉(zhuǎn)listNode的情況下于未,就只能借助外部結(jié)構(gòu)來(lái)實(shí)現(xiàn)翻轉(zhuǎn)linkedList了撕攒,那么久可以用FILO的STACK來(lái)存儲(chǔ)L1和L2
        Stack<ListNode> q1 = new Stack<ListNode>();
        Stack<ListNode> q2 = new Stack<ListNode>();
        
        while (l1 != null) {
            q1.add(l1);
            l1 = l1.next;
        }
        
        while (l2 != null) {
            q2.add(l2);
            l2 = l2.next;
        }
        
        //2. 同時(shí)從q1/q2中取出節(jié)點(diǎn),算2者相加的結(jié)果(邏輯與Add Two Numbers一致)烘浦,算好的結(jié)果仍然放入到STACK結(jié)構(gòu)中
        Stack<ListNode> result = new Stack<ListNode>();
        int carry = 0;
        while (!q1.isEmpty() && !q2.isEmpty()) {
            int sum = q1.pop().val + q2.pop().val + carry;
            int cur = sum % 10;
            carry = sum / 10;
            result.add(new ListNode(cur));
        }
        
        while (!q1.isEmpty()) {
            int sum = q1.pop().val + carry;
            int cur = sum % 10;
            carry = sum / 10;
            result.add(new ListNode(cur));
        }
        
        while (!q2.isEmpty()) {
            int sum = q2.pop().val + carry;
            int cur = sum % 10;
            carry = sum / 10;
            result.add(new ListNode(cur));
        }
        
        if (carry != 0) {
            result.add(new ListNode(carry));
        }
        
        //3. 從stack中依次取出結(jié)果的每個(gè)節(jié)點(diǎn)抖坪,并組織成LinkedList
        ListNode dummy = new ListNode(0);
        ListNode head = dummy;
        
        while (!result.isEmpty()) {
            head.next = result.pop();
            head = head.next;
        }
        return dummy.next;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谎倔,隨后出現(xiàn)的幾起案子柳击,更是在濱河造成了極大的恐慌猿推,老刑警劉巖片习,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蹬叭,居然都是意外死亡藕咏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門秽五,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)孽查,“玉大人,你說(shuō)我怎么就攤上這事坦喘∶ぴ伲” “怎么了西设?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)答朋。 經(jīng)常有香客問(wèn)我贷揽,道長(zhǎng),這世上最難降的妖魔是什么梦碗? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任禽绪,我火速辦了婚禮,結(jié)果婚禮上洪规,老公的妹妹穿的比我還像新娘印屁。我一直安慰自己,他們只是感情好斩例,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布雄人。 她就那樣靜靜地躺著,像睡著了一般樱拴。 火紅的嫁衣襯著肌膚如雪柠衍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天晶乔,我揣著相機(jī)與錄音珍坊,去河邊找鬼。 笑死正罢,一個(gè)胖子當(dāng)著我的面吹牛阵漏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翻具,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼履怯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了裆泳?” 一聲冷哼從身側(cè)響起叹洲,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎工禾,沒(méi)想到半個(gè)月后运提,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闻葵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年民泵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片槽畔。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栈妆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鳞尔,我是刑警寧澤嬉橙,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站寥假,受9級(jí)特大地震影響憎夷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昧旨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一拾给、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兔沃,春花似錦蒋得、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至怕吴,卻和暖如春窍侧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背转绷。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工伟件, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人议经。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓斧账,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親煞肾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咧织,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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