2.兩數(shù)相加

題目

給出兩個 非空 的鏈表用來表示兩個非負的整數(shù)馆蠕。其中,它們各自的位數(shù)是按照 逆序 的方式存儲的播赁,并且它們的每個節(jié)點只能存儲 一位 數(shù)字。

如果容为,我們將這兩個數(shù)相加起來,則會返回一個新的鏈表來表示它們的和坎背。

您可以假設除了數(shù)字 0 之外,這兩個數(shù)都不會以 0 開頭抬纸。

示例:

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

解法一(我的思路)

思路:

將兩個鏈表代表的數(shù)字給表示出來,再將其求和耿戚,將將求和結果按照逆序的鏈表形式輸出即可!

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}// 相當于類聲明的初始化
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        // 先計算出兩個鏈表之間所代表的之和
        int sum = 0;
        int temp_i=1;
        
        ListNode *temp = l1;
        
        do{
            sum += temp->val*temp_i;
            
            temp_i = temp_i*10;
            temp = temp->next;
        }while(temp!=NULL);
        
        temp = l2;
        temp_i = 1;  
        do{
            sum += temp->val*temp_i;
            
            temp_i = temp_i*10;
            temp = temp->next;
        }while(temp!=NULL);
        // 計算完成求和 開始創(chuàng)建新的鏈表 用來存放新的數(shù)據(jù)
        
        ListNode * p = new ListNode(0);
        ListNode * q;// 用來移動新生成的鏈表
        q = p;
        int num = 0;
        num = sum % 10;
        sum = sum / 10;
        p->val = num;
        do{
            ListNode *newNode = new ListNode(0); // 創(chuàng)建新的節(jié)點
            if(sum>0) break;
            int num = 0;
            num = sum % 10;
            sum = sum / 10;
            
            // 給臨時節(jié)點賦值
            newNode->val = num;
            newNode->next = NULL;
            
            q->next = newNode; //將臨時節(jié)點賦值給移動的鏈表(指向新的鏈表)
            q = newNode; // 此時移動的鏈表需要移動到當前節(jié)點上來
        }while(sum>0);
        return p;
    }
};

在執(zhí)行代碼上計算結果與預期的結果一致坛猪,但是提交代碼時墅茉,老是提示錯誤呜呐? 我開始絕望了。執(zhí)行代碼的時間4ms洋机,但是提交結果會出現(xiàn)錯誤洋魂?
錯誤提示為:

Line 28: Char 29: runtime error: signed integer overflow: 1000000000 * 9 cannot be represented in type 'int' (solution.cpp)

始終沒有找到錯誤的原因? 但是覺得自己的思路是對的副砍! 所以就沒有糾結這個問題,查看評論中網(wǎng)友給的答案豁翎?

解法二(自己的思路二)

思路:

由于對于該數(shù)據(jù)表示的單鏈表而言,其表示的第一個數(shù)字代表整數(shù)的個位數(shù)谨垃,其表示的第二位代表整數(shù)的十位數(shù),以此類推刘陶。牢撼。。
同理另外一個數(shù)也是這樣表示的熏版,所以當兩個數(shù)字相加時捍掺,就是個位相加,遇到大于10挺勿,進一位即可喂柒,即可以在對鏈表遍歷的同時計算出最終的結果。

(需要考慮兩個鏈表不一樣長的問題灾杰!)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}// 相當于類聲明的初始化
 * };
 */
class Solution
{
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        ListNode *result = new ListNode(0); //存放結果的鏈表
        ListNode *p1 ,*p2; //分別指向兩個相加的鏈表
        ListNode *temp ; // 臨時節(jié)點 存放臨時數(shù)據(jù)
        temp = result;
        p1 = l1 , p2 = l2;
        int z = 0; // 用來表示最終相同位數(shù)求和有沒有超過10的
        while(p1!=NULL || p2!=NULL){ //當兩個指針都為空跳出來(思想差不多 不過后面參考了答案)  
            // 用這種方式可以避免其判斷 兩個鏈表之間的長度問題 當一個鏈表到頭了艳吠,用0表示后面位數(shù)
            int x = (p1!=NULL) ? p1->val : 0 ;
            int y = (p2!=NULL) ? p2->val : 0 ;

            if(p1) p1 = p1->next;
            if(p2) p2 = p2->next;
            
            int sum = z + x+y;
            z = sum /10; // 用來記錄大于10的位數(shù)(進一位則會記錄下來)
            temp->next = new ListNode( sum % 10 ); 
            temp = temp->next;
        }
        
        // 當兩者都已經(jīng)為空 看最后一位有沒有超過10的值
        if(z>0) temp->next = new ListNode(z);
        
        return result->next;
        
    }
};

與答案的思想相同,但好像最后有參考答案怎么寫的昭娩,雖然用的是java語言凛篙,因為覺得他寫的會比我自己寫的更簡潔一點,但是后面還是盡量少的參考答案吧@该臁P!迈嘹!

中間有發(fā)現(xiàn)出現(xiàn)錯誤是削彬,時間超時,后面檢查發(fā)現(xiàn)代碼錯誤P阒佟融痛! 所以一般不會出現(xiàn)超時的現(xiàn)象!

結果: 時間 40ms 97.14%. 內(nèi)存 19.2M 37.42%

解答三 (網(wǎng)友答案1)

使用了遞歸的思想神僵,效率挺高的雁刷!

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        return addByBit(l1, l2, 0);
    }
    ListNode* addByBit(ListNode* l1, ListNode* l2, int carry) {
        if (l1 == NULL) l1 = new ListNode(0);
        if (l2 == NULL) l2 = new ListNode(0);
        ListNode *l = new ListNode((l1->val + l2->val + carry) % 10);
        carry = (l1->val + l2->val + carry) / 10;
        if(l1->next != NULL || l2->next != NULL || carry == 1) {
            l->next = addByBit(l1->next, l2->next, carry);
        }
        return l;
    }
};

時間: 40ms
內(nèi)存: 19.6M

解答四 (網(wǎng)友答案2)

主要的套路跟我第二個套路是一樣的。

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *ans = new ListNode(0), *t1=l1, *t2=l2;
        ListNode *anshead=ans;
        int carry=0;

            while(t1||t2){
                if(t1){
                    carry+= t1->val;
                    t1 = t1->next;
                }
                if(t2){
                    carry+= t2->val;
                    t2 = t2->next;
                }
                ans->val = carry%10;
                carry /= 10;
                if(t1||t2||carry){
                    ans->next = new ListNode(carry);
                    ans = ans->next;
                }
            }
            return anshead;
    }
};

時間:44ms
內(nèi)存: 19.2M

問題:

使用鏈表的操作不太熟悉保礼,對鏈表的使用掌握的不夠沛励!

學習鏈表知識:

鏈表主要包括兩個方面:

數(shù)據(jù)域 和 指針域

  1. 單鏈表節(jié)點信息包括:
  • 數(shù)據(jù)域 : 用于存儲數(shù)據(jù)元素的值

  • 指針域(鏈域): 用于存放下一個節(jié)點地址或者指向后面節(jié)點的指針

struct Node{
    int val; //數(shù)據(jù)域
    Node *next; //指針域
}

具體參考鏈接...

參考鏈接:

  1. https://www.cnblogs.com/byonecry/p/4458821.html
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炮障,隨后出現(xiàn)的幾起案子目派,更是在濱河造成了極大的恐慌,老刑警劉巖企蹭,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顽照,居然都是意外死亡,警方通過查閱死者的電腦和手機奢人,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門土辩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拷淘,“玉大人贬堵,你說我怎么就攤上這事≌舻睿” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盖腕。 經(jīng)常有香客問我溃列,道長,這世上最難降的妖魔是什么雅任? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上殉摔,老公的妹妹穿的比我還像新娘逸月。我一直安慰自己,他們只是感情好恩尾,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般蔫磨。 火紅的嫁衣襯著肌膚如雪堤如。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天抵赢,我揣著相機與錄音,去河邊找鬼。 笑死骇塘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的奠货。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杉编!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起光酣,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后庆揩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年娄昆,在試婚紗的時候發(fā)現(xiàn)自己被綠了哺眯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡掌猛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殖卑,到底是詐尸還是另有隱情,我是刑警寧澤园细,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痢法。R本人自食惡果不足惜躬络,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一甘凭、第九天 我趴在偏房一處隱蔽的房頂上張望丹弱。 院中可真熱鬧,春花似錦、人聲如沸恐仑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畅姊。三九已至,卻和暖如春萍嬉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背行冰。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留故硅,地道東北人腾誉。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓跷敬,卻偏偏與公主長得像桶癣,于是被迫代替她去往敵國和親饺鹃。 傳聞我的和親對象是個殘疾皇子惹挟,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • 題目地址:https://leetcode-cn.com/problems/add-two-numbers/ 題目...
    monkey01閱讀 532評論 0 0
  • 2. 兩數(shù)相加 給出兩個非空的鏈表用來表示兩個非負的整數(shù)。其中,它們各自的位數(shù)是按照逆序的方式存儲的刀森,并且它們的每...
    liulei_ahu閱讀 284評論 0 2
  • 一榜晦、題目原型: 給定兩個非空鏈表來表示兩個非負整數(shù)朽寞。位數(shù)按照逆序方式存儲,它們的每個節(jié)點只存儲單個數(shù)字脓恕。將兩數(shù)相加...
    花果山松鼠閱讀 512評論 0 0
  • 給定兩個非空鏈表來表示兩個非負整數(shù)轮傍。位數(shù)按照逆序方式存儲仙逻,它們的每個節(jié)點只存儲單個數(shù)字桨醋。將兩數(shù)相加返回一個新的鏈表...
    0Xday閱讀 389評論 0 0
  • 昨天,我和學姐出去招新,我們社團屬于文學社團赁严,本就是交流探討文學方面的知識,我們向他們介紹讀書的好處,許多新生...