leetCode之鏈表操作

首頁目錄 點擊查看

第一題

  • 難度:中等
  • 題目: 2. 兩數(shù)相加
    給出兩個 非空 的鏈表用來表示兩個非負的整數(shù)吨枉。其中均芽,它們各自的位數(shù)是按照 逆序 的方式存儲的进泼,并且它們的每個節(jié)點只能存儲 一位 數(shù)字。
    如果亡电,我們將這兩個數(shù)相加起來,則會返回一個新的鏈表來表示它們的和。
    您可以假設(shè)除了數(shù)字 0 之外粥庄,這兩個數(shù)都不會以 0 開頭。

示例

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

解題思路

之前一直沒有碰過鏈表相關(guān)的東西豺妓,所以對于鏈表很陌生惜互,在JS前端環(huán)境也沒有鏈表這個東西,所以整體我都是參考題解來處理的琳拭。
我們使用變量來跟蹤進位训堆,并從包含最低有效位的表頭開始模擬逐位相加的過程。


image.png

圖1白嘁,對兩數(shù)相加方法的可視化: 342 + 465 = 807342+465=807坑鱼,每個結(jié)點都包含一個數(shù)字,并且數(shù)字按位逆序存儲絮缅。
就像你在紙上計算兩個數(shù)字的和那樣鲁沥,我們首先從最低有效位也就是列表 l1l1 和 l2l2 的表頭開始相加。由于每位數(shù)字都應(yīng)當處于 0 \ldots 90…9 的范圍內(nèi)耕魄,我們計算兩個數(shù)字的和時可能會出現(xiàn) “溢出”黍析。例如,5 + 7 = 125+7=12屎开。在這種情況下阐枣,我們會將當前位的數(shù)值設(shè)置為 22马靠,并將進位 carry = 1carry=1 帶入下一次迭代。進位 carrycarry 必定是 00 或 11蔼两,這是因為兩個數(shù)字相加(考慮到進位)可能出現(xiàn)的最大和為 9 + 9 + 1 = 199+9+1=19甩鳄。

偽代碼如下:

  • 將當前結(jié)點初始化為返回列表的啞結(jié)點。
  • 將進位 carrycarry 初始化為 00额划。
  • 將 pp 和 qq 分別初始化為列表 l1l1 和 l2l2 的頭部妙啃。
  • 遍歷列表 l1l1 和 l2l2 直至到達它們的尾端。
  • 將 xx 設(shè)為結(jié)點 pp 的值俊戳。如果 pp 已經(jīng)到達 l1l1 的末尾揖赴,則將其值設(shè)置為 00。
  • 將 yy 設(shè)為結(jié)點 qq 的值抑胎。如果 qq 已經(jīng)到達 l2l2 的末尾燥滑,則將其值設(shè)置為 00。
  • 設(shè)定 sum = x + y + carrysum=x+y+carry阿逃。
  • 更新進位的值铭拧,carry = sum / 10carry=sum/10。
  • 創(chuàng)建一個數(shù)值為 (sum \bmod 10)(summod10) 的新結(jié)點恃锉,并將其設(shè)置為當前結(jié)點的下一個結(jié)點搀菩,然后將當前結(jié)點前進到下一個結(jié)點。
  • 同時破托,將 pp 和 qq 前進到下一個結(jié)點肪跋。
  • 檢查 carry = 1carry=1 是否成立,如果成立土砂,則向返回列表追加一個含有數(shù)字 11 的新結(jié)點州既。
  • 返回啞結(jié)點的下一個結(jié)點。
    請注意瘟芝,我們使用啞結(jié)點來簡化代碼易桃。如果沒有啞結(jié)點,則必須編寫額外的條件語句來初始化表頭的值锌俱。
    請?zhí)貏e注意以下情況:
測試用例 說明
l1=[0,1]l1=[0,1]晤郑,l2=[0,1,2]l2=[0,1,2] 當一個列表比另一個列表長時
l1=[]l1=[]戳晌,l2=[0,1]l2=[0,1] 當一個列表為空時伦连,即出現(xiàn)空列表
l1=[9,9]l1=[9,9],l2=[1]l2=[1] 求和運算最后可能出現(xiàn)額外的進位搅吁,這一點很容易被遺忘

答案

var addTwoNumbers = function (l1, l2) {
    let node = new ListNode('head');
    let temp = node;//啞結(jié)點
    let add = 0;//是否進一
    let sum = 0;//新鏈表當前未取余的值 = 鏈表1值 + 鏈表2值 + add;
    //遍歷吭练,直到最長的都為空
    while (l1 || l2) {
        sum = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + add;
        temp.next = new ListNode(sum % 10);//取余則為新鏈表的值
        temp = temp.next;
        add = sum >= 10 ? 1 : 0;
        l1 && (l1 = l1.next);
        l2 && (l2 = l2.next);
    }
    add && (temp.next = new ListNode(add))
    return node.next;
};
image.png

第二題

給定一個鏈表: 1->2->3->4->5, 和 n = 2.

當刪除了倒數(shù)第二個節(jié)點后签赃,鏈表變?yōu)?1->2->3->5.

解題思路

  • 這道題還是鏈表題谷异,使用雙指針的思想確認要刪除的節(jié)點;n 是從 1 開始的(不是從 0 開始);
1 -> 2 -> 3 -> 4 -> 5 -> null
第一步:  left與 right 的距離為 n + 1;
  left           right
dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> null
第二步: 始終保持  left與 right 的距離為 n + 1, 向右移動, 直到 right 為 null, 此時  left 的位置就是要刪除節(jié)點上一個的位置。
                 left             right
dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> null

我的答案

var removeNthFromEnd = function (head, n) {
    let summay = new ListNode(0);
    summay.next = head;
    let left = summay;
    let right = summay;
    let offset = n + 1
    while (offset--) {
        right = right.next;
        if (offset > 1 && right === null) {
            return summay.next
        }
    }
    while (right) {
        right = right.next;
        left = left.next;
    }
    left.next = left.next.next
    return summay.next
};
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锦聊,一起剝皮案震驚了整個濱河市歹嘹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孔庭,老刑警劉巖尺上,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異圆到,居然都是意外死亡怎抛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門芽淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來马绝,“玉大人,你說我怎么就攤上這事吐绵〖L剩” “怎么了河绽?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵己单,是天一觀的道長。 經(jīng)常有香客問我耙饰,道長纹笼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任苟跪,我火速辦了婚禮廷痘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘件已。我一直安慰自己笋额,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布篷扩。 她就那樣靜靜地躺著兄猩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鉴未。 梳的紋絲不亂的頭發(fā)上枢冤,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音铜秆,去河邊找鬼淹真。 笑死,一個胖子當著我的面吹牛连茧,可吹牛的內(nèi)容都是我干的核蘸。 我是一名探鬼主播巍糯,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼客扎!你這毒婦竟也來了鳞贷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤虐唠,失蹤者是張志新(化名)和其女友劉穎搀愧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疆偿,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡咱筛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杆故。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迅箩。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖处铛,靈堂內(nèi)的尸體忽然破棺而出饲趋,到底是詐尸還是另有隱情,我是刑警寧澤撤蟆,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布奕塑,位于F島的核電站,受9級特大地震影響家肯,放射性物質(zhì)發(fā)生泄漏龄砰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一讨衣、第九天 我趴在偏房一處隱蔽的房頂上張望换棚。 院中可真熱鬧,春花似錦反镇、人聲如沸固蚤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夕玩。三九已至,卻和暖如春辆亏,著一層夾襖步出監(jiān)牢的瞬間风秤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工扮叨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缤弦,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓彻磁,卻偏偏與公主長得像碍沐,于是被迫代替她去往敵國和親狸捅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361