题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
- 题目数据保证列表表示的数字不含前导零
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
① 计算两个链表的长度
② 短链表补0,长度与长链表一致
③ 遍历求和;若大于10,flag=1,和减去10,反之flag=0。
④ 遍历结束,判断flag是否等于1,等于1创造值为1的结点。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
//创建新链表的头
struct ListNode*headl3=(struct ListNode*)malloc(sizeof(struct ListNode));
headl3->next=NULL;
struct ListNode*curl3=headl3;
struct ListNode*h1=l1;
struct ListNode*h2=l2;
int len1=1,len2=1;
//计算l1和l2的长度
while(h1->next)
{
h1=h1->next;
++len1;
}
while(h2->next)
{
h2=h2->next;
++len2;
}
//补短链表后面的0
int gap=0;
if(len1>len2)
{
gap=len1-len2;
while(gap)
{
struct ListNode* newNode=(struct ListNode*)malloc(sizeof(struct ListNode));
h2->next=newNode;
h2=newNode;
newNode->next=NULL;
newNode->val=0;
--gap;
}
}
else
{
gap=len2-len1;
while(gap)
{
struct ListNode* newNode=(struct ListNode*)malloc(sizeof(struct ListNode));
h1->next=newNode;
h1=newNode;
newNode->next=NULL;
newNode->val=0;
--gap;
}
}
int flag=0;//是否进位
while(l1)
{
struct ListNode*l3=(struct ListNode*)malloc(sizeof(struct ListNode));
l3->val=0;
l3->next=NULL;
curl3->next=l3;
curl3=l3;
l3->val=l2->val+l1->val;
if(flag==1)
l3->val=l3->val+1;
if(l3->val>=10)
{
l3->val=l3->val-10;
flag=1;
}
else
{
flag=0;
}
l1=l1->next;
l2=l2->next;
}
if(flag==1)
{
struct ListNode*endl3=(struct ListNode*)malloc(sizeof(struct ListNode));
endl3->next=NULL;
curl3->next=endl3;
endl3->val=1;
}
return headl3->next;
}