LeetCode - 2.两数相加

LeetCode - 2.两数相加

题目

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:

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

分析

这个题主要分析出什么情况下需要增加一个节点,在链表1不为空,链表2为空时,需要创建一个新的节点,来承接链表1多出来的一位以及上一次循环进位的和;同理,链表2不为空,链表1为空,需要创建一个新的节点,来承接链表2多出来的一位以及上一次循环进位的和;还有,链表1与链表2都为空了,但是上一次循环有进位,需要创建一个新的节点来承接进位数据。这三种情况下需要创建新节点。直到两个链表都为空停止循环,返回链表头部。

题目不是很难,不过也被卡住了,心疼自己。。。
出现了如下错误
member access within misaligned address 0x000000000031 for type 'struct ListNode', which requires 8 byte alignment
原因最后返回的指针没有指向NULL,所以最后一定要加上

lr->next = NULL;

题解

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* l1node = l1;
    struct ListNode* l2node = l2;
    //创建新的链表来表示求和
    struct ListNode* lr = (struct ListNode*)malloc(sizeof(struct ListNode));
    lr->val = 0;
    lr->next = NULL;
    //存储头部节点
    struct ListNode* rlr = lr;
    while(l1node!=NULL||l2node!=NULL){
        int l1val = 0;
        int l2val = 0;
        l1val = l1node == NULL ? 0 : l1node->val;
        l2val = l2node == NULL ? 0 : l2node->val;
        //对应位求和同时加上进位
        int sum = lr->val + l1val + l2val;
        lr->val = sum%10;
        if(l1node!= NULL){
            l1node = l1node->next;
        }
        if(l2node!= NULL){
            l2node = l2node->next;
        }
        struct ListNode* nl = (struct ListNode*)malloc(sizeof(struct ListNode));
        //进位
        nl->val = sum/10;
        //三种情况
        if(l1node != NULL || l2node != NULL || sum/10 != 0){
            lr->next = nl;
            lr = lr->next;
        }
    }
    //不能或略最终指向为空
    lr->next = NULL;
    return rlr;
}

在这里插入图片描述
多喷喷才能有长进啊,希望各位不要留情面,使劲怼我这乱七八糟的代码。
补上之前的不足,静下心来,积少成多,希望在大家的监督下,变得更强

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值