天天看點

2 兩數之和 c++

LeetCode2 兩數之和

問題描述

給出兩個 非空 的連結清單用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,并且它們的每個節點隻能存儲 一位 數字。

将這兩個數相加起來,傳回一個新的連結清單來表示它們的和。假設除了數字 0 之外,這兩個數都不會以 0 開頭。

算法思路

從兩個連結清單的表頭元素開始逐個相加,設立一個進位标志,直到周遊完兩個連結清單的所有元素且進位标志為0時結束。

即結束的條件為: ! ( L1 || L2 || carry)

代碼實作

#include<iostream>

using namespace std;

struct ListNode{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}  
};

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2);

int main(){
    ListNode l1(0);
    ListNode l2(0);
    ListNode l3(0);
    ListNode *p1 = &l1;
    ListNode *p2 = &l2;
    ListNode *p3 = &l3;
    p1->val = 9;
    p2->val = 8;
    p3 = addTwoNumbers(p1, p2);
    while(p3 != nullptr){
        cout << p3->val << " ";
        p3 = p3->next;
    }
    cin.get();
    return 0;	//程式執行後輸出:7 1
}

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode vHead(0), *p = &vHead;		//構造一個頭結點,并用指針p指向該結點,傳回時将頭結點的下一個結點傳回。
    int carry = 0; 
    while(l1 || l2 || carry){	
        int temp = 0;	//連結清單的下一個元素的值
        if(l1 != nullptr) temp += l1->val;
        if(l2 != nullptr) temp += l2->val;
        temp += carry;

        carry = temp / 10;
        temp %= 10;

        ListNode *next = l1 ? l1 : l2;
        if(next == nullptr) next = new ListNode(temp);
        next->val = temp;

        p->next = next;
        p = p->next;
        l1 = l1 ? l1->next : nullptr;
        l2 = l2 ? l2->next : nullptr;
    }
    return vHead.next;
}