---
# System prepended metadata

title: 67. Add Binary && 2. Add Two Numbers 筆記
tags: [LeetCode]

---

# 67. Add Binary && 2. Add Two Numbers 筆記

題目:給定兩個二進製字串a和b，將它們的總和作為二進製字串傳遞。

要注意兩個字串相加完後可能會進位，所以要處理進位問題，以及字串要倒過來讀取，使用push_back後再reverse回來，這邊參考了標準解法使用了carry進位字元來處理進位問題，並且漂亮的使用了`a[i]-'0'`來作為字串轉數字的方法來解題。

```cpp=
class Solution {
public:
    string addBinary(string a, string b) {
        string result;
        int i=a.size()-1, j=b.size()-1, carry=0;
        
        while(i>=0||j>=0){
            int sum=carry;
            if(i>=0){sum+=a[i]-'0'; --i;}
            if(j>=0){sum+=b[j]-'0'; --j;}
            result.push_back(sum%2+'0');
            carry = sum/2;
        }
        if(carry) result.push_back(carry+'0');
        reverse(result.begin(),result.end());
        return result;
    }
};
```

第二題跟這題十分類似，主要是加上linked list而已，然後變成十進位，再另外進行處理。

```cpp=
/**
 * Definition for singly-linked list.
 * 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) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode * resultNode = new ListNode(0);
        ListNode * result = resultNode;
        int carry = 0;
        int sum;
        while(l1||l2){
            sum=carry;
            if(l1){sum+=l1->val; l1=l1->next;}
            if(l2){sum+=l2->val; l2=l2->next;}
            carry = sum/10;
            result->next = new ListNode(sum%10);
            result = result->next;
        }
        if(carry) result->next = new ListNode(1);
        return resultNode->next;
    }
};

```


###### tags: `LeetCode`