兩個非負整數以逆序鏈表儲存(個位在頭),逐位相加產生新鏈表(亦逆序)。如 (2→4→3) + (5→6→4) = 7→0→8(342+465=807)。
len1, len2。O(max(len1,len2))。struct ListNode { int val; ListNode *next; ListNode(int x):val(x),next(nullptr){} };
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (!l1) return l2; if (!l2) return l1;
int len1=0, len2=0;
for (auto p=l1;p;p=p->next) ++len1;
for (auto p=l2;p;p=p->next) ++len2;
ListNode *longer = len1>=len2 ? l1 : l2;
ListNode *shorter = len1>=len2 ? l2 : l1;
ListNode *p = longer, *q = shorter;
int carry = 0;
ListNode *prev = nullptr;
while (p && q) {
int sum = p->val + q->val + carry;
p->val = sum % 10; carry = sum / 10;
prev = p; p = p->next; q = q->next;
}
while (p && carry) {
int sum = p->val + carry;
p->val = sum % 10; carry = sum / 10;
prev = p; p = p->next;
}
if (carry) {
prev->next = new ListNode(carry);
}
return longer;
}
};
prev 記錄長鏈表最後處理節點,用於掛載進位節點。O(N),空間 O(1)(不計輸出)。Add Two Numbers 考驗鏈表指針操作與進位邏輯。原地修改長鏈表是空間最優解法,面試中常被追問「不修改輸入如何做」,需準備雙版本。