【LeetCode】Add Two Numbers

本文介绍了解决两数相加问题的三种链表实现方法。第一种使用递归方式,第二种通过补零处理不同长度链表的情况,第三种则针对等长与不等长链表提供了解决方案。

解法一:

递归方式

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        if (l1 == NULL || l2 == NULL) {
            return l1 == NULL ? l2 : l1;
        }
        int value = l1->val + l2->val;
        ListNode* result = new ListNode(value % 10);
        result->next = addTwoNumbers(l1->next, l2->next);
        if (value >= 10) {
            result->next = addTwoNumbers(new ListNode(value / 10), result->next);
        }
        return result;
    }
};

解法二:

两个链表对应位相加,如果一个链表为空,则在其后面补0继续计算,直到两个链表都为空。

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        if (l1 == NULL || l2 == NULL) {
            return l1 == NULL ? l2 : l1;
        }
        ListNode *temp = new ListNode(0);
        ListNode *result = temp;

        int carry = 0;
        int remainder = 0;
        while (l1 && l2) {
            remainder = (l1->val + l2->val + carry) % 10;    // 余数
            carry = (l1->val + l2->val + carry) / 10;    // 进位
            temp->next = new ListNode(remainder);
            l1 = l1->next;
            l2 = l2->next;
            temp = temp->next;
            if (l1 == NULL && l2 == NULL) {
                break;
            }
            if (l1 == NULL)
                l1 = new ListNode(0);
            if (l2 == NULL)
                l2 = new ListNode(0);
        }
        if (carry != 0)
            temp->next = new ListNode(carry);
        return result->next;
    }
};

解法三

摘自『九章算法』的答案。
将过程分为三个子过程,先将两个链表等长度部分的数字之和计算出来,直到一个链表为空。此时如果l1不为空,则将l1链表的值与“进位”相加再取余做为下一个结果元素的值,直到计算至l1也为空,l2不为空时同理。

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        if (l1 == NULL || l2 == NULL) {
            return l1 == NULL ? l2 : l1;
        }
        ListNode *result = new ListNode(0);
        ListNode *temp = result;
        int sum = 0;
        int carry = 0;
        while (l1 && l2) {
            sum = carry + l1->val + l2->val;
            temp->next = new ListNode(sum % 10);
            carry = sum / 10;
            l1 = l1->next;
            l2 = l2->next;
            temp = temp->next;
        }
        while (l1) {
            sum = carry + l1->val;
            temp->next = new ListNode(sum % 10);
            carry = sum / 10;
            l1 = l1->next;
            temp = temp->next;
        }
        while (l2) {
            sum = carry + l2->val;
            temp->next = new ListNode(sum % 10);
            carry = sum / 10;
            l2 = l2->next;
            temp = temp->next;
        }
        if (carry != 0)
            temp->next = new ListNode(carry);
        return result->next;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值