LeetCode 2.两数相加(c++)

题目描述:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

 

 

解题思路:

我们可以按照自然运算的法则,一步一步进行加法,需要注意每一次运算的进位,特别是最后一步如果有进位,要将进位值加入到新的链表中。

 

 

代码:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* l3 = new ListNode(0);   //构造头结点
        ListNode *p1 = l1;
        ListNode *p2 = l2;
        ListNode *p3 = l3;
        
        int sum = 0, carry = 0;            //每一步运算的结果sum,进位值carry
        while(p1 != NULL || p2 != NULL)      //如果两个链表没有处理完全
        {
            int x = (p1!=NULL)? p1->val :0;    //若其中一个链表处理完,则用0代替节点的值
            int y = (p2!=NULL)? p2->val :0;
            sum = x + y + carry;
            carry = sum/10;           //记录每一步运算的进位值
            p3->next = new ListNode(sum%10);        //为结果值新建一个节点
            p3 = p3->next;
            if(p1 != NULL)
            {
                p1 = p1->next;
            }
            if(p2 != NULL)
            {
                p2 = p2->next;
            }
        }
        if(carry != 0)             //最后一步运算如果还有进位,则将其插入链表中
        {
            p3->next = new ListNode(carry);
            p3 = p3->next;
        }
        return l3->next;
    }

 

总结:

这种链表类型的题目,就按照一般方法进行简单模拟就行。我在网上还看到一种解法是将两条链表分别转化成对应的数值,进行相加,再将结果保存为链表形式。这种方法不太可取,若是链表足够长,则数值会超过int型的表示范围。而且链表本身就是一种动态的数据结构,长度不固定,不适合使用这种方法操作。链表的魅力在于不定长,可以随时添加或删除,链表内的值不必连续存储,而是通过指针进行连接,使操作更灵活。

 

最后,欢迎关注我的公众号,会定期更新一些机器学习的小知识,欢迎大家一起学习讨论。

LeetCode 2.两数相加(c++)_第1张图片

你可能感兴趣的:(leetcode)