LeetCode解法從慢到快——2. Add Two Numbers

  • 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.普通思路

開(kāi)始一個(gè)循環(huán),當(dāng)兩個(gè)鏈表最后一個(gè)元素的next元素為null時(shí)結(jié)束循環(huán)。
在這個(gè)循環(huán)中涵叮,分為三種情況:

  1. 兩個(gè)鏈表都有值辐董,相加即可调炬。
  2. 只有一個(gè)鏈表有值函筋,取之即可盼忌。
  3. 兩個(gè)鏈表都沒(méi)有值贝润,跳出循環(huán)绊茧。

有一個(gè)特殊情況,相加大于等于10的數(shù)打掘,需要減去10华畏,然后向next進(jìn)1。

  public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int addOne=0;
        ListNode l3=new ListNode(0);
        ListNode q=l1,p=l2,r=l3;
        while(l1!=null && l2!=null){
            if(l1.next!=null||l2.next!=null){
                 r.next=new ListNode(0);
            }
            if(l1==null && l2!=null){
                r.val=l2.val;
                l2=l2.next;
            }else if(l2==null && l1!=null){
                r.val=l1.val;
                l1=l1.next;
            }else {
                r.val=l1.val+l2.val;
                l2=l2.next;
                l1=l1.next;
            }
            if(addOne==1){
                r.val++;
                addOne=0;
            }
            if(r.val>=10){
                r.val=r.val-10;
                addOne=1;
            }
            r=r.next;
        }
        return l3;
    }
  • 遇到的第一個(gè)問(wèn)題尊蚁。



    思考不周亡笑,有進(jìn)1的情況,需要注意横朋,即使最后元素的next都為null仑乌,有進(jìn)1時(shí)也需要進(jìn)1。
    進(jìn)行修改如下:

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
      int addOne=0;
      ListNode l3=new ListNode(0);
      ListNode q=l1,p=l2,r=l3;
      while(l1!=null || l2!=null||addOne==1){
          if(l1==null && l2!=null){
              r.val=l2.val;
              l2=l2.next;
          }else if(l2==null && l1!=null){
              r.val=l1.val;
              l1=l1.next;
          }else if(l1==null && l2==null){//處理末端兩數(shù)相加大于10的情況
              r.val=addOne;
              addOne=0;
          }else{
              r.val=l1.val+l2.val;
              l2=l2.next;
              l1=l1.next;
          }
          if(addOne==1){
              r.val++;
              addOne=0;
          }
          if(r.val>=10){
              r.val=r.val-10;
              addOne=1;
          }
          if(l1!=null||l2!=null||addOne==1){
              r.next=new ListNode(0);
          }
          r=r.next;
      }
      return l3;
    }
    
    Runtime: 73 ms
    Beats:6.08%

2. 優(yōu)化思路

  • 找出題中基本元素

    1. 鏈表l1琴锭,鏈表l2晰甚。
    2. 超出的計(jì)數(shù)值addOne。
    3. 返回的l3和其鏈接值r决帖。

    找出題中基本步驟

    1. 循環(huán) 循環(huán)判斷因素只有l(wèi)1 和 l2

    2. 返回值

    3. 根據(jù)l1,l2和是否進(jìn)1位得到l3val值厕九。 將null看為0,不用去一一判斷是否為null地回,方便計(jì)算扁远。

    4. 當(dāng)l3val值大于10時(shí)腺阳,進(jìn)1 分為兩種情況,一是循環(huán)內(nèi)穿香,一是循環(huán)外,分開(kāi)處理即可绎速。

    5. 將next new一個(gè)對(duì)象 new對(duì)象時(shí)就將val值賦入皮获。

    6. 處理最后一個(gè)超出的ListNode 將值后移,即處理第一個(gè)ListNode纹冤,返回l3.next鏈表洒宝。
      得到以下代碼:

       public ListNode addTwoNumbersTwo(ListNode l1, ListNode l2) {
       ListNode l3 = new ListNode(0);
       ListNode r = l3;
       int addOne = 0;
       while (l1 != null || l2 != null) {
           int a = (l1 != null) ? l1.val : 0;
           int b = (l2 != null) ? l2.val : 0;
           int sum = addOne + a + b;
           addOne = sum / 10;
           r.next = new ListNode(sum % 10);
           r = r.next;
           if (l1 != null) l1 = l1.next;
           if (l2 != null) l2 = l2.next;
       }
       if (addOne > 0) {
           r.next = new ListNode(addOne);
       }
       return l3.next;
       }
      

      Runtime:72 ms
      Beats: 6.90%

3. 再次優(yōu)化

  • a,b萌京, sum 值冗余雁歌,嘗試使用addone替代。
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
          ListNode newhead = new ListNode(0);
          ListNode l3 = newhead;
          ListNode p1=l1,p2=l2;
          int addOne = 0;
          while (p1 != null || p2 != null) {
              if (p1 != null) {
                  addOne += p1.val;
                  p1 = p1.next;
              }
              if (p2 != null) {
                  addOne += p2.val;
                  p2 = p2.next;
              }
              l3.next = new ListNode(addOne % 10);
              l3 = l3.next;
              addOne /= 10;
          }
          if (addOne ==1) {
              l3.next = new ListNode(addOne);
          }
          return newhead.next;
      }
    
    Runtime: 48 ms
    Beats:94.39%
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末知残,一起剝皮案震驚了整個(gè)濱河市靠瞎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌求妹,老刑警劉巖乏盐,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異制恍,居然都是意外死亡父能,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)净神,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)何吝,“玉大人,你說(shuō)我怎么就攤上這事鹃唯“牛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵俯渤,是天一觀的道長(zhǎng)呆细。 經(jīng)常有香客問(wèn)我,道長(zhǎng)八匠,這世上最難降的妖魔是什么絮爷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮梨树,結(jié)果婚禮上坑夯,老公的妹妹穿的比我還像新娘。我一直安慰自己抡四,他們只是感情好柜蜈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布仗谆。 她就那樣靜靜地躺著,像睡著了一般淑履。 火紅的嫁衣襯著肌膚如雪隶垮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天秘噪,我揣著相機(jī)與錄音狸吞,去河邊找鬼。 笑死指煎,一個(gè)胖子當(dāng)著我的面吹牛蹋偏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播至壤,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼威始,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了像街?” 一聲冷哼從身側(cè)響起黎棠,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镰绎,沒(méi)想到半個(gè)月后葫掉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跟狱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年俭厚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驶臊。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挪挤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出关翎,到底是詐尸還是另有隱情扛门,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布纵寝,位于F島的核電站论寨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏爽茴。R本人自食惡果不足惜葬凳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望室奏。 院中可真熱鬧火焰,春花似錦、人聲如沸胧沫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纯赎,卻和暖如春谦疾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犬金。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工餐蔬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佑附。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像仗考,于是被迫代替她去往敵國(guó)和親音同。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)秃嗜。 張土汪:刷leetcod...
    土汪閱讀 12,747評(píng)論 0 33
  • //leetcode中還有花樣鏈表題权均,這里幾個(gè)例子,冰山一角 求單鏈表中結(jié)點(diǎn)的個(gè)數(shù)----時(shí)間復(fù)雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,520評(píng)論 0 6
  • Description You are given two non-empty linked lists repr...
    CNSumi閱讀 239評(píng)論 0 0
  • 用 TDD 來(lái)練習(xí)完成 LeetCode 的第 2 題锅锨,題目描述如下叽赊。 LeetCode 第 2 題 題目解釋:給...
    就是91閱讀 462評(píng)論 0 2
  • 問(wèn)題:You are given twonon-emptylinked lists representing tw...
    三三333三三閱讀 298評(píng)論 0 0