題目連結(https://leetcode.com/problems/add-two-numbers/description/)
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 contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
一直不想面對 Linked list,但還是要練,所以拿經典題來寫~
[1, 100]
. 不會有空的 Linked list0 <= Node.val <= 9
l1 = 2→4→3
l2 = 5→6→4
從尾串到頭(個位),相加然後再給出新的 Linked list
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.
l1 || l2 || carry
(三者任一存在就繼續)carry = sum / 10
digit = sum % 10
// 創建節點
ListNode* node = new ListNode(5);
// 訪問值
int value = node->val;
// 訪問下一個節點
ListNode* nextNode = node->next;
// 遍歷鏈表
while (node != nullptr) {
cout << node->val;
node = node->next; // 移動到下一個
}
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
ListNode* current = dummy; // current 指向 dummy
int carry = 0; //record是否要進位
// 只要還有節點或還有進位,就繼續
while(l1 || l2 || carry){
int sum = carry;
if(l1){
sum += l1 ->val;
l1 = l1 -> next;
}
if(l2){
sum += l2 ->val;
l2 = l2 -> next;
}
carry = sum/10; //多出來的十位數字表示進位
current -> next = new ListNode(sum%10);//餘數當節點值
current = current -> next;
}
return dummy->next;
}
};
範例: [2,4,3] + [5,6,4] = [7,0,8]
步驟 1: 2 + 5 + 0(進位) = 7
l1: 2 -> 4 -> 3
l2: 5 -> 6 -> 4
結果: 7
carry: 0
步驟 2: 4 + 6 + 0(進位) = 10
l1: 4 -> 3
l2: 6 -> 4
結果: 7 -> 0
carry: 1
步驟 3: 3 + 4 + 1(進位) = 8
l1: 3
l2: 4
結果: 7 -> 0 -> 8
carry: 0
**Multiply Strings Medium**
**Add Binary Easy**
**Sum of Two Integers Medium**
// 節點定義
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) {}
};
初始化:
dummy & current
↓
┌───┬────┐
│ 0 │null│
└───┴────┘
加入第一個節點 (7):
dummy current
↓ ↓
┌───┬────┐ ┌───┬────┐
│ 0 │ ●--├──>│ 7 │null│
└───┴────┘ └───┴────┘
完整鏈表:
dummy 第1個 第2個 第3個
↓ ↓ ↓ ↓
┌───┬────┐ ┌───┬────┐ ┌───┬────┐ ┌───┬────┐
│ 0 │ ●--├──────>│ 7 │ ●--├──>│ 0 │ ●--├──>│ 8 │null│
└───┴────┘ └───┴────┘ └───┴────┘ └───┴────┘
return dummy->next 返回這個指針 ↓
┌───┬────┐ ┌───┬────┐ ┌───┬────┐
│ 7 │ ●--├──>│ 0 │ ●--├──>│ 8 │null│
└───┴────┘ └───┴────┘ └───┴────┘
dummy
是虛擬頭節點return dummy->next
dummy虛擬占位,最後丟棄
current = dummy表示指針指向位置,不是複製
new ListNode(值) 建立節點,括號內是 val
return dummy->next返回頭部,即可連續返回整個鏈表
->next
訪問所有後續節點if (l1) 和 if (l1 != nullptr) 是相同的,都代表說 l1 還有值,非空
ps. 部分內容經 AI 協助整理