LeetCode題目詳解(一)——兩數相加

題目描述

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-two-numbers

思路解析

先提取關鍵信息:兩個整數非負逆序存儲按位存儲實現不同位數相加

首先分析程序流程應當如下:

在這裏插入圖片描述

因爲題目只讓寫核心算法,所以這裏只寫核心算法,即addTwoNumbers()函數,其餘數據處理請詳見代碼

  1. 考慮到兩個鏈表的數字位數可能不一樣,而運算是否停止取決於位數大的數字,因此在做相加時,判斷條件爲兩個鏈表任意一個不爲空,則運算繼續
  2. 對於123+123這種,不需要考慮進位,而像123+996這種,需要考慮進位的問題,因此在做相加時,判斷條件爲進位是否爲0,因此應該設置一個變量carry記錄進位

從而得出限制條件爲 l1 != 0 || l2 != 0 || carry != 0

在此條件下逐位相加,每加一次,就將結果放入result節點,但是直接放不行,因爲sum = 7+8 = 15,每個節點只能存儲一位數字,因此利用sum%10記錄進位後個位上的數,利用sum/10向carry傳遞進位數據,最終將結果存入新鏈表並返回

代碼:

#include <bits/stdc++.h>

using namespace std;

//節點類
class ListNode
{
public:
    int val;
    ListNode *next;
    ListNode() {}
    ListNode(int x):val(x),next(nullptr) {}
    ListNode* Insert(string str,ListNode *l)
    {
        ListNode *s,*r = l;
        for(auto &x : str)
        {
            if(isdigit(x))
            {
                s = new ListNode();
                s->val=x-'0';
                r->next=s;
                r=s;
            }
        }
        r->next = NULL;
        return l;
    }
};
//核心算法類
class Solution
{
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        ListNode *tmp = nullptr;
        ListNode *result = nullptr;

        int carry = 0;

        while(l1 != nullptr || l2 != nullptr ||carry != 0)
        {
            int sum = (l1 == nullptr ? 0:l1->val) + (l2 == nullptr ? 0:l2->val) + carry;
            carry = sum/10;

            ListNode *node = new ListNode(sum%10);
            if(tmp == nullptr)
            {
                tmp = node;
                result = tmp;
            }
            else
            {
                tmp->next = node;
                tmp = tmp->next;
            }
            l1 = l1 == nullptr ? nullptr:l1->next;
            l2 = l2 == nullptr ? nullptr:l2->next;
        }
        return result;
    }
};
//按照 + 將字符串分割爲兩部分
vector<string> split(const string &str, const string &pattern)
{
    vector<string> res;
    if(str == "")
        return res;
    string strs = str + pattern;
    size_t pos = strs.find(pattern);

    while(pos != strs.npos)
    {
        string temp = strs.substr(0, pos);
        res.push_back(temp);
        strs = strs.substr(pos+1, strs.size());
        pos = strs.find(pattern);
    }

    return res;
}

int main()
{
    char s[1000];
    cin.getline(s,50);

    vector<string> result = split(s,"+");

    ListNode *l1 = new ListNode();
    l1->Insert(result[0],l1);
    ListNode *l2 = new ListNode();
    l2->Insert(result[1],l2);

    Solution Sve;
    ListNode *res = Sve.addTwoNumbers(l1->next,l2->next);

    cout<<res->val<<" -> "<<res->next->val<<" -> "<<res->next->next->val;
    return 0;
}

Sve.addTwoNumbers(l1->next,l2->next);

cout<<res->val<<" -> "<<res->next->val<<" -> "<<res->next->next->val;
return 0;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章