兩個非空鏈表表示非負整數,**逆序存儲**(個位在頭)。逐位相加,返回和鏈表(亦逆序)。如 (2→4→3) + (5→6→4) = 7→0→8(342+465=807)。
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode dummy(0), *tail = &dummy;
int carry = 0;
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;
tail->next = new ListNode(sum % 10);
tail = tail->next;
}
return dummy.next;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
return add(l1, l2, 0);
}
ListNode* add(ListNode* l1, ListNode* l2, int carry) {
if (!l1 && !l2 && !carry) return nullptr;
int sum = carry;
ListNode *n1=null, *n2=null;
if (l1) { sum += l1->val; n1 = l1->next; }
if (l2) { sum += l2->val; n2 = l2->next; }
ListNode* node = new ListNode(sum % 10);
node->next = add(n1, n2, sum / 10);
return node;
}
l1 || l2 || carry 確保最高位進位不丟失。sum % 10,進位 sum / 10。| 維度 | 迭代 | 遞歸 |
|---|---|---|
| 空間 | O(1) | O(max(n,m)) |
| 棧溢出風險 | 無 | 極長鏈表可能 |
| 代碼簡潔度 | 中等 | 高 |
推薦迭代寫法,生產環境更安全。
O(1)。