力扣 两数相加 C语言 题解

**

力扣 两数相加 C语言 题解

**


一、完整题目

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807。
在这里插入图片描述

示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

二、解题思路

  • 首先,初始化求和列表的头节点,然后进入循环。
  • 循环至 l1 和 l2 链表都为空的时候才结束,每次循环分配一个结点空间。
  • 设置进位标志 flag,和求和项 sum,有进位 flag = 1否则为 0;sum为两个链表当前结点的值的和加上标志位的值。
  • 分两种情况:1.两个链表都没加完,此时,每次从两个链表中取出一项相加,判断是否进位,有进位就只加个位,否则直接加。2.两个链表有一个加完了,所以只需要每次将 sum 的值改为,一个链表的值加上标志位即可,其他与第一种情况一致。
  • 循环结束后,还要进行一次判断,是否退出循环时,有未加的标志位,如果有,就加上即可。
  • 最后,将求和链表重新从头节点开始,并返回此链表。

二、编写代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    //定义:和的链表
    struct ListNode* lSum;
    //定义:头节点
    struct ListNode* head;
    //定义:中间变量
    struct ListNode* tmp;
    //定义:进位标志(初始化置0),和
    int flag=0,sum;

    //分配空间
    lSum = (struct ListNode*) malloc(sizeof(struct ListNode));
    //初始化
    lSum->next = NULL;
    //保存头节点
    head = lSum;

    //求和
    while (l1 || l2)
    {
        //分配空间
        tmp = (struct ListNode*) malloc(sizeof(struct ListNode));
        //初始化
        tmp->next = NULL;
        //将和指向下一位    
        lSum->next = tmp;
        lSum = lSum->next;

        //进位求和
        if(l1 && l2) 
        {
            sum = l1->val + l2->val + flag;
            if(sum > 9)
            {
                sum %= 10;
                flag = 1;
            }
            else flag = 0;
            lSum->val = sum;
        }
        if(l1 && !l2)
        {
            sum = l1->val + flag;
            if(sum > 9)
            {
                sum %= 10;
                flag = 1;
            }
            else flag = 0;
            lSum->val = sum;
        }
        if(!l1 && l2)
        {
            sum = l2->val + flag;
            if(sum > 9)
            {
                sum %= 10;
                flag = 1;
            }
            else flag = 0;
            lSum->val = sum;
        }

        //l1,l2分别指向下一位
         if (l1) l1 = l1->next;
         if (l2) l2 = l2->next;
    }

    //如果还存在进位
    if (flag)
    {
        //分配空间
        tmp = (struct ListNode*) malloc(sizeof(struct ListNode));
        //初始化
        tmp->next = NULL;
        //将和指向下一位    
        lSum->next = tmp;
        lSum = lSum->next;
        //赋值
        lSum->val = flag;
    }

    //重新指向头节点
    lSum = head->next;

    return lSum;
}

四、测评结果

在这里插入图片描述
我写的方法只能说可以完成题目,还有很大的提升空间,可以好好精进。

五、总结评价

此题不是很有难度,主要考察对单向链表的掌握程度,掌握的熟练的话,此题很快就完成了,不然会在编写代码的过程中,总是有各种小错误。所以,一定好好看数据结构,将基本的数据类型都掌握。

有问题欢迎各位大佬指出
力扣系列将持续更新,欢迎关注,一起学习

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S1XmKl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值