leetcode 2 AddTwoNumbers

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Forlogen/article/details/84678542

题目描述:
在这里插入图片描述

给定两个非空的链表,要求从头将两个列表中的值相加,并将结果存储到另一个列表中。
在这里插入图片描述
这里主要处理的一个问题就是两个数相加的进位问题!我们直到列表中元素的取值范围在[0 - 9],那么最大的两个元素相加9+9=18,这时进位为1,所以可以看出进位的取值范围为[0 - 1]。

AC代码:

class Solution{
public:

    //法1
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2){
        //存储一个存储结果的列表,初始化头部为-1
        ListNode *res = new ListNode(-1);
        //cur指向列表的头部
        ListNode *cur = res;
        //初始化进位为0
        int carry = 0;
        //遍历l1和l2,直到全部为空
        while (l1 != NULL || l2 != NULL){
            //相加
            int n1 = l1 ? l1->val : 0;
            int n2 = l2 ? l2->val : 0;
            int sum = n1 + n2 + carry;
            //更新进位,若sum > 10,则carry = 1 
            carry = sum / 10;
            //将取余的结果存储到新节点中
            cur->next = new ListNode(sum % 10);
            //指针后移
            cur = cur->next;
            //当不为空时,指针后移,继续运算
            if (l1)
                l1 = l1->next;
            if (l2)
                l2 = l2->next;
        }
        //计算最后一位时,若存在进位,则添加新的节点
        if (carry)
            cur->next = new ListNode(1);
        return res->next;
    }

    //法2
    ListNode *addTwoNumbers(ListNode *l1,ListNode *l2){
        ListNode *dummy = new ListNode(0);
        ListNode *pos = dummy;
        int carry = 0;
        //计算直到其中某一个列表为空
        while(l1 != NULL && l2 != NULL){
            int sum = l1->val + l2->val + carry;
            carry = sum / 10;
            pos->next = new ListNode(sum % 10);
            l1 = l1->next;
            l2 = l2->next;
            pos = pos->next;
        }

        //继续计算非空的那个列表
        while(l1 != NULL){
            int sum = l1->val + carry;
            carry = sum / 10;
            pos->next = new ListNode(sum % 10);
            l1 = l1->next;
            pos = pos->next;
        } 
        while(l2 != NULL){
            int sum = l2->val + carry;
            carry = sum / 10;
            pos->next = new ListNode(sum % 10);
            l2 = l2->next;
            pos = pos->next;
        }
        //处理最后的进位
        if(carry != 0)
             pos->next = new ListNode(carry);
        return dummy->next;
    }
};

参见:
【LeetCode】2. Add Two Numbers 解题报告
2. Add Two Numbers Solution

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/84678542