題目及要求:
給你兩個 非空 的鏈表,表示兩個非負的整數,它們每位數字都是按照 逆序 的方式存盤的,并且每個節點只能存盤 一位 數字,
請你將兩個數相加,并以相同形式回傳一個表示和的鏈表,
你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭,
提示:
每個鏈表中的節點數在范圍 [1, 100] 內
0 <= Node.val <= 9
題目資料保證串列表示的數字不含前導零
原創代碼:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode *l1, ListNode *l2) {
ListNode* root = new ListNode(0);//用于建立出發點
ListNode* cursor = root;//用于連接路徑點
int carry = 0;
while(l1 != nullptr || l2 != nullptr || carry != 0) {
int l1Val = l1 != nullptr ? l1->val : 0;
int l2Val = l2 != nullptr ? l2->val : 0;
int sumVal = l1Val + l2Val + carry;
carry = sumVal / 10;
ListNode* sumNode = new ListNode(sumVal % 10);
cursor->next = sumNode;//將本次結構體連上新結構體
cursor = sumNode;//將本次新結構體準備與下次新結構體連上
if(l1 != nullptr) l1 = l1->next;
if(l2 != nullptr) l2 = l2->next;
}
return root->next;//第一次存入資料的是root->next
}
};
輸出示例:
示例 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]
代碼思路:
首先:
ListNode* root = new ListNode(0);//用于建立出發點
其次:
ListNode* cursor = root;//用于連接路徑點
再其次:
將最終輸出的鏈表的每一個資料大小用sumVal表示,接著定義
ListNode* sumNode = new ListNode(sumVal % 10)
來存盤每一個新的sumVal, 再通過
cursor->next = sumNode;//將本次結構體連上新結構
和
cursor = sumNode;//將本次新結構體準備與下次新結構體連上
將cursor與每個新的sumNode相連
最后:
由于第一個資料是通過root->next進行存盤的,所以root->next代表出發節點
反思所得:
剛開始做這道題的時候我總是希望將兩個鏈表的資料分別表達為兩個數,然后將兩數之和表達為一個新的鏈表,但隨之面臨了兩個整型數相加會造成溢位所以只能一位一位的相加,與匯編語言帶進位加法相似,
LeetCode鏈接:
https://leetcode-cn.com/problems/add-two-numbers/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290874.html
標籤:其他
