当前位置:   article > 正文

力扣 两数相加 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96

四、测评结果

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

五、总结评价

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/52769
推荐阅读
相关标签
  

闽ICP备14008679号