兩個非空鏈表表示兩個非負整數,數字**逆序**存儲 (個位在頭)。將兩數相加,返回和的鏈表 (同樣逆序)。例如:(2→4→3) + (5→6→4) = 7→0→8 (342+465=807)。
同時遍歷兩鏈表,對應位相加加上進位,結果取模 10 存入新節點,進位 = 除 10。任一鏈表結束視為 0。最後若有進位補一節點。
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode dummy(0);
ListNode* 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; }
tail->next = new ListNode(sum % 10);
tail = tail->next;
carry = sum / 10;
}
return dummy.next;
}
dummy 簡化頭節點處理。l1 || l2 || carry 完美覆蓋所有情況 (含最後進位)。LeetCode 2 是「鏈表模擬大整數加法」的標準模板。核心是「哨兵節點 + 同步遍歷 + 進位傳播」。此模板直接擴展可解決「兩數相減、大整數乘法 (分治/FFT)、多數相加」等變體。