**
力扣 两数相加 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;
}
四、测评结果
我写的方法只能说可以完成题目,还有很大的提升空间,可以好好精进。
五、总结评价
此题不是很有难度,主要考察对单向链表的掌握程度,掌握的熟练的话,此题很快就完成了,不然会在编写代码的过程中,总是有各种小错误。所以,一定好好看数据结构,将基本的数据类型都掌握。
有问题欢迎各位大佬指出
力扣系列将持续更新,欢迎关注,一起学习