题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
一、示例
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
二、思路
1.定义一个标记数,来标记前一位相加有没有进位;
2.新创建一个链表来存储相加后的值;
3.进入循环,直到俩链表都到尾;
处理其中一个链表到结尾的方法为,每次循环开始的时候判断一下,若为空,即把其的值假定为0;
4.最后的处理,若最后俩链表都到尾,但标记进位的数为1,即继续添加节点。
三、代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int x, y, num, flag=0;//x表示l1的值,y表示l2的值,flag为进位标记
struct ListNode *cur = (struct ListNode*)malloc(sizeof(struct ListNode));
cur->next = NULL;
struct ListNode *ret = cur;//定义一个指针,用来返回链表
while(l1!=NULL || l2!=NULL)//俩链表都走到尾
{
x = (l1!=NULL)?l1->val:0;//判断是否为空,为空把值假定为0
y = (l2!=NULL)?l2->val:0;
num = x+y+flag;//包含进位的1,看该位应该为多少
flag = num/10;//判断是否进位
cur->next = (struct ListNode*)malloc(sizeof(struct ListNode));
cur = cur->next;
cur->val = num%10;//取余,保证其<9
cur->next = NULL;
if(l1!=NULL)//判断是否为空,空则不能进行next操作
l1 = l1->next;
if(l2!=NULL)
l2 = l2->next;
}
if(flag > 0)//最后节点的处理,若此时进位标记为1,则添加节点
{
cur->next = (struct ListNode*)malloc(sizeof(struct ListNode));
cur = cur->next;
cur->val = 1;
cur->next = NULL;
}
return ret->next;//注意,应返回ret->next,因为没给第一个节点赋值
}
总结
本题有几个点容易忽略,比如:最后一个节点若为10,很容易忽略继续构建节点。我最初的想法是将l1和l2的每个节点都变为相加后的值,最后哪个长就输出哪个,但却忽略了刚才这个易错点。