【Leetcode】2.两数相加

本文介绍了一种链表加法的算法实现,该算法能够处理两个逆序存储的非负整数链表相加的问题。通过遍历链表并考虑进位情况,最终返回表示两数之和的新链表。

题目描述

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

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

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

算法描述

  • 算法思路:遍历链表即可。要注意的是两链表不等长和进位的情况。
  • 算法步骤:
  1. 遍历l1和l2两个链表直到其中一个链表遍历完毕,将val相加,若大于9则进一位。
  2. 若l1和l2不等长,接着遍历较长的链表的剩余结点。进行同样的加法操作。
  3. 如果l1和l2都遍历完毕但进位不为0,则结果链表需要再加一个结点保存进位的值。

注意:

  1. 每个链表最后一个结点的next指针要初始化为NULL。
  2. 结构体的声明中,构造函数的写法是:
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
  1. 给指针分配空间时,假设有两个链表l1和l3,l3指向l1表头。在给l1分配空间时,如果写成
ListNode *l1 = new ListNode(0), *l3 = l1;
l1 = new ListNode(0);

这个时候l1会被重新分配到新的地址空间,l3不会再随着l1的改变而改变。
在做加法操作的时候,l1向后移动,给next指针分配空间的正确写法是:

ListNode *l1 = new ListNode(0), *l3 = l1;
l1->next = (ListNode*) malloc(sizeof(ListNode));
l1 = l1->next;
l1->val = xxx;
l1->next = NULL;

C++代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *h1 = l1, *h2 = l2, *res = new ListNode(0), *res2 = res;
        int Cin = 0;
        while(h1 != NULL && h2 != NULL){
            int tmp = h1->val + h2->val + Cin;
            Cin = 0;
            res->val = tmp%10;
            res->next = NULL;
            if(tmp > 9){
                Cin = tmp/10;
            }
            h1 = h1->next;
            h2 = h2->next;
            if(h1 != NULL && h2 != NULL){
                res->next = (ListNode*) malloc(sizeof(ListNode));
                res = res->next;
            }
        }
        while(h1 != NULL){
            res->next = (ListNode*) malloc(sizeof(ListNode));
            int tmp = h1->val + Cin;
            res = res->next;
            res->val = tmp%10;
            Cin = 0;
            if(tmp > 9){
                Cin = tmp/10;
            }
            res->next = h1->next;
            h1 = h1->next;
        }
        while(h2 != NULL){
            res->next = (ListNode*) malloc(sizeof(ListNode));
            res = res->next;
            int tmp = h2->val + Cin;
            res->val = tmp%10;
            Cin = 0;
            if(tmp > 9){
                Cin = tmp/10;
            }
            res->next = h2->next;
            h2 = h2->next;
        }
        if(Cin != 0){
            res->next = (ListNode*) malloc(sizeof(ListNode));
            res = res->next;
            res->val = Cin;
            res->next = NULL;
        }
        return res2;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值