LeetCode刷題之路 2 兩數相加

2022-06-05 20:36:07 字數 2823 閱讀 7530

給你兩個 非空 的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。

請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。

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

示例 1:

輸入:l1 = [2,4,3], l2 = [5,6,4]

輸出:[7,0,8]

解釋:342 + 465 = 807.

示例 2:

輸入:l1 = [0], l2 = [0]

輸出:[0]

示例 3:

輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]

輸出:[8,9,9,9,0,0,0,1]

每個鍊錶中的節點數在範圍 [1, 100] 內

0 <= node.val <= 9

題目資料保證列表表示的數字不含前導零

這道題實際上思路很容易想出來,難點在於單鏈表(不帶頭結點)的相關操作,再就是考慮進製的問題。要考慮三種情況:l1長度更長,l2長度更長,l1和l2長度同樣長,這三種情況分開來寫。

具體請看下面**中的注釋:

listnode* addtwonumbers(listnode* l1, listnode* l2) 

else

p = new listnode(sum); // 為結果鍊錶開闢乙個新節點

if(l == nullptr)

else

p1 = p1 -> next;

p2 = p2 -> next;

}while(p1 != nullptr)else

p = new listnode(sum);

if(l == nullptr)

else

p1 = p1 -> next;

}while(p2 != nullptr)else

p = new listnode(sum);

if(l == nullptr)

else

p2 = p2 -> next;

}if(flag > 0)

return l;

}

現在把上面的三種情況的**精簡一下,通過乙個迴圈中的條件將三種情況都考慮到。主要操作是將迴圈條件設為||,然後在獲取val和next時需要加上if條件判斷當前節點是否為nullptr。**如下:

listnode* addtwonumbers(listnode* l1, listnode* l2) 

else

p = new listnode(sum); // 為結果鍊錶開闢乙個新節點

if(l == nullptr)

else

if(p1 != nullptr) // 如果鍊錶1還未到達鍊錶尾部

p1 = p1 -> next;

if(p2 != nullptr) // 如果鍊錶2還未到達鍊錶尾部

p2 = p2 -> next;

}if(flag > 0)

return l;

}

注:再解釋一下nullptr:nullptr是c++11新引入的,c++98中是沒有的。如果使用c++98編譯器,可以用將nullptr換成null。實際上null表示空指標會帶來二義性問題(具體來說null在c++中被巨集定義為int型的0,而不直接表示空指標,這就帶來了二義性問題),所以在c++11中引入了nullptr替代null。

因為題目給出的是部分**,沒法在編譯器直接執行。主要有單鏈表列印函式**,還有主函式**。其餘的測試**如下:

void print(listnode *p)

cout << endl;

}int main()

全部**如下:

#include using namespace std;

struct listnode

listnode(int x) : val(x), next(nullptr) {}

listnode(int x, listnode *next) : val(x), next(next) {}

};class solution

else

p = new listnode(sum); // 為結果鍊錶開闢乙個新節點

if(l == nullptr)

else

if(p1 != nullptr) // 如果鍊錶1還未到達鍊錶尾部

p1 = p1 -> next;

if(p2 != nullptr) // 如果鍊錶2還未到達鍊錶尾部

p2 = p2 -> next;

}if(flag > 0)

return l;

}};void print(listnode *p)

cout << endl;

}int main()

這道題思路確實不難,但是這道題難就難就在需要考慮單鏈表的相關操作和兩個鍊錶長度的不同情況上。尤其不帶頭結點的單鏈表的尾插法建立需要想清楚如何操作,至於其他的也就相當簡單了。

本來不想寫這道題的,但是因為這道題讓我知道了了c++中null和nullptr的區別,所以還是寫了一篇部落格來記錄一下。以後就不用null來表示空指標的,改用nullptr了。

堅持不懈地努力才能成為大神!

leetcode刷題之路2 兩數相加

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...

LeetCode刷題之路 兩數相加

給你兩個 非空 的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 1 輸入 l1 2,4,3 l2 5,6,4 輸出 7,0,8 ...

LeetCode刷題之路 1 兩數之和

最近要開始刷題了,打算每天要刷一兩道演算法題,對於一些難的演算法知識點要及時搞懂 然後按時參加leetcode的周賽和雙周賽。立此部落格為證,作為監督。給定乙個整數陣列 nums 和乙個整數目標值 target,請你在該陣列中找出 和為目標值 的那 兩個 整數,並返回它們的陣列下標。你可以假設每種輸...