2. 兩數相加
解題思路
設置啞結點,插入適當結點
左邊到右邊都是個位數開始, 所以進行模擬加法即可
- 得到 位數值 注意:當指針指向空時 我們認爲 此時值爲0 便於處理
- 進行加法模擬
- 特殊情況分析 當兩邊結點掃描完 需要加入新結點時
例子
250 + 750, 需要多加1位 最高位
複雜度分析
空間複雜度 O(1)
時間複雜度 O(N)
代碼
/**
* 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) {
// dummy 啞結點 插入適當結點
// 左邊到右邊都是個位數開始, 所以進行模擬加法即可
// if l1 or l2 == nullptr l1 l2 = 0
// if l1 + l2 + jinwei <= 10 :
// 加入 l1 + l2
// jinwei = 0
// else :
// 加入 l1 + l2 + jinwei % 10
// jinwei = 1
ListNode* dummy = new ListNode(-1);
ListNode* end = dummy;
int x1 = 0, x2 = 0, ifadd = 0;
//x1 x2 表示相加的值 當指針指向空時 我們認爲 此時 值爲0 便於處理
while (l1 != nullptr || l2 != nullptr) {
if (l1 == nullptr) {
x1 = 0;
} else {
x1 = l1->val;
l1 = l1->next;
}
if (l2 == nullptr) {
x2 = 0;
} else {
x2 = l2->val;
l2 = l2->next;
}
cout << x1 << x2 << endl;
if (x1 + x2 + ifadd < 10) {
end->next = new ListNode(x1 + x2 + ifadd);
ifadd = 0;
} else {
end->next = new ListNode((x1 + x2 + ifadd)%10);
ifadd = 1;
}
end = end->next;
}
//特色情況分析 當結點掃描完 需要加入新結點時
if (ifadd != 0) {
end->next = new ListNode(1);
end = end->next;
}
return dummy->next;
}
};
心得
開始還想着 先把兩個 數字提取出來
後面看例子發現 , 之所以給我們倒敘就是, 想讓我們模擬加法操作
-
實現過程中 依然用dummy 結點 來處理 沒有結點的問題, 然後往鏈表裏面尾加元素
尾加元素
end->next = new ListNode(1); end = end->next;
-
巧妙的把 掃描到空的點 認爲他的值爲0, 避免了很多異常情況