首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 2 Add Two Numbers:鏈表逐位相加進位處理完整遞歸/迭代實現

     編輯:關於C++

問題描述

兩個非空鏈表表示非負整數,**逆序存儲**(個位在頭)。逐位相加,返回和鏈表(亦逆序)。如 (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 確保最高位進位不丟失。
  • 空指針視為 0 參與相加。
  • 新節點值 sum % 10,進位 sum / 10。

遞歸與迭代對比

維度迭代遞歸
空間O(1)O(max(n,m))
棧溢出風險無極長鏈表可能
代碼簡潔度中等高

推薦迭代寫法,生產環境更安全。

進階:不修改輸入、雙向鏈表、大整數相加

  • 先反轉鏈表、相加、再反轉結果(或用棧存儲節點)。
  • 若允許修改輸入,可直接在較長鏈表上原地修改,空間 O(1)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved