我是靠谱客的博主 跳跃手链,最近开发中收集的这篇文章主要介绍力扣 两数相加 C语言 题解力扣 两数相加 C语言 题解一、完整题目二、解题思路二、编写代码四、测评结果五、总结评价,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

**

力扣 两数相加 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;
}

四、测评结果

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

五、总结评价

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

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

最后

以上就是跳跃手链为你收集整理的力扣 两数相加 C语言 题解力扣 两数相加 C语言 题解一、完整题目二、解题思路二、编写代码四、测评结果五、总结评价的全部内容,希望文章能够帮你解决力扣 两数相加 C语言 题解力扣 两数相加 C语言 题解一、完整题目二、解题思路二、编写代码四、测评结果五、总结评价所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部