簡體   English   中英

對兩個鏈表求和

[英]Sum two Linked Lists

我有一個這樣的節點:

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) {}
};

我想使用遞歸對兩個鏈接列表求和。 我不確定,但我想這是尾遞歸。

輸入: l1 = [2,4,3],l2 = [5,6,4]

Output: [7,0,8]

解釋: 342 + 465 = 807。

這是我的代碼:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2, int carry = 0,ListNode *result = nullptr) {
    int n1 = l1 != nullptr ? l1->val : 0;
    int n2 = l2 != nullptr ? l2->val : 0;
    int val = (n1 + n2 + carry) % 10;
    if(result == nullptr){
        result = new ListNode(val);
    }else{
        result->next = new ListNode(val);
        result = result->next;
    }
    result = addTwoNumbers(l1->next != nullptr ? l1->next : nullptr,
                           l2->next != nullptr ? l2->next : nullptr, 
                           (n1 + n2 + carry) - 10,result);
    return result;
}

但是即使傳遞兩個單節點列表,我也會遇到分段錯誤:

ListNode * a = new ListNode(1);
ListNode * b = new ListNode(2);
ListNode * c = addTwoNumbers(a, b); 
std::cout << c->val << "\n";

我看不出有什么問題,它應該可以工作。 我錯過了什么?

有幾個問題:

  • 你的遞歸永遠不會停止,這就是分段錯誤的原因——在遞歸調用中你評估l1->next ,但在某個點l1將是一個空指針,所以你得到了異常。 缺少所謂的遞歸“基本情況”。 當兩個列表指針都是 null 並且沒有進位時,不應該遞歸調用,而是應該返回一個 null 指針
  • (n1 + n2 + carry) - 10是錯誤的公式。 它應該是(n1 + n2 + carry) / 10
  • result = result->next; 是錯誤的,因為您將永遠失去對剛剛創建的節點的引用。 創建新列表的頭部后,該頭部不需要再次更改。 當您第一次將參數的頭值相加時,該總和也應該出現在結果中,並且對一個節點的引用是 function 應該返回的內容。

還:

  • 不必將result作為參數傳遞。 確保遞歸調用為您作為參數傳遞的較短列表返回一致的結果(鏈表)。 然后,您要做的“唯一”事情是將當前總和作為節點添加到該返回列表中,然后您就完成了。 所以result參數真的不需要。

這是更正后的代碼:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2, int carry = 0) {
    // base case
    if (l1 == nullptr && l2 == nullptr && carry == 0) return nullptr;
    int n1 = l1 != nullptr ? l1->val : 0;
    int n2 = l2 != nullptr ? l2->val : 0;
    int sum = n1 + n2 + carry;
    return new ListNode(sum % 10, 
        addTwoNumbers(l1 != nullptr ? l1->next : nullptr, 
                      l2 != nullptr ? l2->next : nullptr, sum / 10));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM