【JS攻略Leetcode】No.2. Add Two Numbers(兩數(shù)相加)

引言:用Js攻略leetcode中的算法吟孙,將會(huì)介紹自己的思路和注意點(diǎn),一邊學(xué)習(xí)一邊愉快刷題呀。

問(wèn)題1:

給定兩個(gè)非空鏈表來(lái)表示兩個(gè)非負(fù)整數(shù)帚称。位數(shù)按照逆序方式存儲(chǔ),它們的每個(gè)節(jié)點(diǎn)只存儲(chǔ)單個(gè)數(shù)字秽澳。將兩數(shù)相加返回一個(gè)新的鏈表世杀。
你可以假設(shè)除了數(shù)字 0 之外,這兩個(gè)數(shù)字都不會(huì)以零開(kāi)頭肝集。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

思考:

  1. 342 + 465 = 807 也就是位位相加瞻坝,注意一下每一位相加要加上進(jìn)位,最后一次兩個(gè)鏈表都到了結(jié)束,也要注意一下有沒(méi)有進(jìn)位:比如 99 + 1 = 100;
  2. 注意鏈表怎么把每個(gè)節(jié)點(diǎn)連接起來(lái):每次生成一個(gè)listnode元素,通過(guò)當(dāng)前l(fā)istnode的下一個(gè)元素(cur_node.next)連城鏈所刀。
  3. 最后返回一個(gè)列表衙荐,所以要給個(gè)頭(result)指示列表起始的位置,再通過(guò)cur_node鏈接起鏈表串

代碼:

/**
* Definition for singly-linked list.
* function ListNode(val) {
*     this.val = val;
*     this.next = null;
* }
*/

var addTwoNumbers = function(l1, l2) {
    var val1 = 0;
    var val2 = 0;
    var carry = 0;//進(jìn)位
    var result = null;//返回值
    var cur_node = null;

    var sumWithCarry = function(sum) {
        if(sum >= 10) {
            carry = 1;
            sum = sum - 10;
        } else {
            carry = 0;
        }
        return sum;
    }

    if(l1 || l2) {
        val1 = l1 ? l1.val : 0;
        val2 = l2 ? l2.val : 0;
        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;
        cur_node = new ListNode(sumWithCarry(val1 + val2));
        result = cur_node;
        while(l1 || l2) {
            val1 = l1 ? l1.val : 0;
            val2 = l2 ? l2.val : 0;
            l1 = l1 ? l1.next : null;
            l2 = l2 ? l2.next : null;
            cur_node.next = new ListNode(sumWithCarry(val1 + val2 + carry));
            cur_node = cur_node.next;
        }
        if(carry != 0) {
            cur_node.next = new ListNode(sumWithCarry(carry));
        }
    }
    return result;
};

問(wèn)題2:

如果鏈表中的數(shù)字不是按逆序存儲(chǔ)的呢浮创?例如:
(3 -> 4 -> 2) + (4 -> 6 -> 5) = 8 -> 0 -> 7
符合人類觀察的習(xí)慣: 342+465 = 807

思路:

  1. 思路1也是位位相加, 將兩個(gè)列表中的值存入數(shù)組中:result_array = [3+4, 4+6, 2+5] = [7,10, 7], 再考慮進(jìn)位為題變成 [ 8, 0, 7 ], 最后生成listnode連接起來(lái)忧吟。但是這種方法在列表不等長(zhǎng)的情況下是不可行了,可跳過(guò)去看最后斩披。
var addTwoNumbers = function(l1, l2) {
    var result_array = [];
    var result = null;//返回值
    var cur_node = null;
    var val1 = 0;
    var val2 = 0;
    while(l1 || l2) {
        val1 = l1 ? l1.val : 0;
        val2 = l2 ? l2.val : 0;
        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;
        result_array.push(val1 + val2)
    }
    for (var i = result_array.length - 1; i >= 0; i--) {
        if(result_array[i] >= 10) {
            result_array[i] = result_array[i] - 10;
            if(i > 0) {
                result_array[i -1] = result_array[i-1] + 1;
            } else {
                result_array.unshift(1);
                return;
            }
        }
    }
    if( result_array.length ){
        result = new ListNode(result_array[0]);
        cur_node = result;
        if(result_array.length > 1) {
            for (var i = 1; i <= result_array.length - 1; i ++) {
                cur_node.next = new ListNode(result_array[i]);
                cur_node = cur_node.next;
            }
        }
    }
    
    return result;
};

乍看起來(lái)非常完美溜族,但是遇到了一個(gè)極其重要的邏輯問(wèn)題:在處理兩列表等長(zhǎng)時(shí)這個(gè)方法可行,但是不等長(zhǎng)時(shí)相加錯(cuò)誤垦沉,比如: [9,9] + [2] = [9, 11]=[1,0,1], 但上述辦法算出來(lái)是[11,9]=[1,1,9],所以在兩列表不等長(zhǎng)時(shí)煌抒,必須將相加位位置對(duì)齊,在另一個(gè)列表元素?cái)?shù)組前面加上很多0厕倍;但是我覺(jué)得這種方式時(shí)間復(fù)雜度太高了寡壮。

  1. 思路2:然后我想為什么不能將它們變?yōu)閿?shù)字再進(jìn)行相加呢?[9,9] + [2] = 99 + 2 = 101 = [1,0,1]

代碼:

var addTwoNumbers = function(l1, l2) {
    var result_array = [];
    var result_sum = 0;
    var result1 = 0;
    var result2 = 0;
    var result = null;//返回值
    var cur_node = null;
    
    var val1 = 0;
    var val2 = 0;

    while(l1 || l2) {
        val1 = l1 ? l1.val : 0;
        l1 = l1 ? l1.next : null;
        result1 = val1 + result1*10;
        val2 = l2 ? l2.val : 0;
        l2 = l2 ? l2.next : null;
        result2 = val2 + result2*10;
    }
    result_sum = result1 + result2;
    while(result_sum >= 10) {
        result_array.push(result_sum % 10);
        result_sum = ~~(result_sum / 10);
    }
    result_array.push(result_sum);

    if( result_array.length ){
        for (var i = result_array.length - 1; i >= 0; i--) {
            if(i == result_array.length - 1) {
                result = new ListNode(result_array[i]);
                cur_node = result;
            } else {
                cur_node.next = new ListNode(result_array[i]);
                cur_node = cur_node.next;
            }
        }
    }
    return result;
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讹弯,一起剝皮案震驚了整個(gè)濱河市况既,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌组民,老刑警劉巖棒仍,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異臭胜,居然都是意外死亡莫其,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)庇楞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)榜配,“玉大人,你說(shuō)我怎么就攤上這事吕晌〉叭欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵睛驳,是天一觀的道長(zhǎng)烙心。 經(jīng)常有香客問(wèn)我,道長(zhǎng)乏沸,這世上最難降的妖魔是什么淫茵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮蹬跃,結(jié)果婚禮上匙瘪,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好丹喻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布薄货。 她就那樣靜靜地躺著,像睡著了一般碍论。 火紅的嫁衣襯著肌膚如雪谅猾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天鳍悠,我揣著相機(jī)與錄音税娜,去河邊找鬼。 笑死藏研,一個(gè)胖子當(dāng)著我的面吹牛敬矩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遥倦,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谤绳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼占锯!你這毒婦竟也來(lái)了袒哥?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤消略,失蹤者是張志新(化名)和其女友劉穎堡称,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體艺演,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡却紧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胎撤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晓殊。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伤提,靈堂內(nèi)的尸體忽然破棺而出巫俺,到底是詐尸還是另有隱情,我是刑警寧澤肿男,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布介汹,位于F島的核電站,受9級(jí)特大地震影響舶沛,放射性物質(zhì)發(fā)生泄漏嘹承。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一如庭、第九天 我趴在偏房一處隱蔽的房頂上張望叹卷。 院中可真熱鬧,春花似錦、人聲如沸骤竹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瘤载。三九已至否灾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸣奔,已是汗流浹背墨技。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挎狸,地道東北人扣汪。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锨匆,于是被迫代替她去往敵國(guó)和親崭别。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 題目描述: 給定兩個(gè)非空鏈表來(lái)表示兩個(gè)非負(fù)整數(shù)恐锣。位數(shù)按照逆序方式存儲(chǔ)茅主,它們的每個(gè)節(jié)點(diǎn)只存儲(chǔ)單個(gè)數(shù)字。將兩數(shù)相加返回...
    coderzc閱讀 172評(píng)論 0 0
  • 1.原題 You are given two non-empty linked lists representin...
    陌兒的百科全書(shū)閱讀 194評(píng)論 0 2
  • 上通信的課就跟室友一起刷題玩土榴,結(jié)果讀題目讀了半天诀姚,好歹我也是過(guò)了四級(jí)的人啊,怎么能這樣玷禽,干脆百度題目意思…… 題目...
    做夢(mèng)枯島醒閱讀 223評(píng)論 0 0
  • Description You are given two non-empty linked lists repr...
    CNSumi閱讀 235評(píng)論 0 0
  • 在20多歲的年華里赫段,還有大把青春的時(shí)候,我的心已經(jīng)老了矢赁,再也不相信我能夠等到愛(ài)情和愛(ài)我的人糯笙。 可惜了大把...
    爾西閱讀 161評(píng)論 0 0