本文记录作者刷题过程中与两数相加相关的题目。

1、数组中的两数相加

989. 数组形式的整数加法(简单难度)

class Solution {
public:
    vector<int> addToArrayForm(vector<int>& num, int k) {
        vector<int> res;
        int i=num.size()-1;
        int sum=0;
        bool carry=false;
        while(i>=0||k){
            sum=0;
            if(i>=0)sum+=num[i--];
            if(k){
                sum+=k%10;
                k/=10;
            }
            if(carry) sum+=1;
            res.push_back(sum%10);
            carry=sum>=10?true:false;
        }
        if(carry) res.push_back(1);
        reverse(res.begin(),res.end());
        return res;
    }
};

2、字符串中的两数相加

415. 字符串相加(简单难度)

class Solution {
public:
    string addStrings(string num1, string num2) {
        string res;
        // 从右向左同时遍历2个可能不等长的字符串
        int i=num1.length()-1;
        int j=num2.length()-1;
        bool carry=false;
        int sum=0;
        while(i>=0||j>=0){
            sum=0;
            if(i>=0) sum+=num1[i--]-'0';
            if(j>=0) sum+=num2[j--]-'0';
            if(carry) sum+=1;
            res =to_string(sum%10)+res;
            carry=sum>=10?true:false;
        }
        // 如果有多余的进位
        if(carry) res =to_string(1)+res;
        return res;
    }
};

3、二进制中的两数相加

67. 二进制求和(简单难度)

剑指 Offer II 002. 二进制加法(简单难度)

class Solution {
public:
    string addBinary(string a, string b) {
        int i=a.length()-1;
        int j=b.length()-1;
        string res;
        bool carry=false;
        int sum=0;
        // 从右向左同时遍历2个可能不等长的字符串
        while(i>=0||j>=0){
            sum=0;
            if(i>=0) sum+=a[i--]-'0';
            if(j>=0) sum+=b[j--]-'0';
            if(carry) sum+=1;
            res =to_string(sum%2)+res;
            carry=sum>=2?true:false;
        }
        if(carry) res =to_string(1)+res;
        return res;
    }
};

4、链表中的两数相加

剑指 Offer II 025. 链表中的两数相加(中等难度)

445. 两数相加 II(中等难度)

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* slow=NULL;//慢指针
        ListNode* fast=head;//快指针
        while(fast!=NULL){
            //保存
            ListNode* temp = fast->next;
            //反转
            fast->next=slow;
            //更新
            slow=fast;
            fast=temp;
        }
        //更新头结点
        head=slow;
        return head;
    }
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head=new ListNode(-1);//结果链表的虚拟头结点
        ListNode* cur=head;//遍历指针
        l1=reverseList(l1);
        l2=reverseList(l2);
        // 同时遍历2个链表
        int sum=0;
        bool carry=false;//是否需要进位
        while(l1||l2){
            sum=0;
            if(l1!=nullptr){
                sum+=l1->val;
                l1=l1->next;
            }
            if(l2!=nullptr){
                sum+=l2->val;
                l2=l2->next;
            }
            if(carry) sum++;
            // 为结果链表添加一个新的结果
            cur->next=new ListNode(sum%10);
            cur=cur->next;
            carry = sum >= 10 ? true: false;//发现需要进位
        }
        if(carry)   cur->next=new ListNode(1);
        head->next = reverseList(head->next);
        return head->next;
    }
};

###