给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接: 力扣
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->val = 1;//头结点可用于保存最后一个位置溢出的1,比如,1 与 9 是0 1
head->next = NULL;
struct ListNode* L = head;
int flag = 0;//溢出标志位
while (l1 && l2)
{
struct ListNode *p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = NULL;
p->val = l1->val + l2->val;
if (flag)//如果上一位有溢出,那就下一位加一个
{
p->val++;
flag = 0;
}
if (p->val > 9)//如果之和大于10,那就溢出置1,且取余
{
flag = 1;
p->val %= 10;
}
L->next = p;
L = p;
l1 = l1->next;
l2 = l2->next;
}
if (l1)//如果l1还有那就接上l1
L->next = l1;
while (l1)//当新链表还有溢出位没有清理时比如,l1是9 9 9 ,l2是1,上面我们的链表变成了0 现在l1还有9 9 没处理
{
if (flag)
{
l1->val++;//
flag = 0;
}
if (l1->val > 9)
{
l1->val %= 10;
flag = 1;
}
L = l1; //L也移动,直到L1的的下一个是null
l1 = l1->next;
}
if (l2)
L->next = l2;
while (l2)
{
if (flag)
{
l2->val++;
flag = 0;
}
if (l2->val > 9)
{
l2->val %= 10;
flag = 1;
}
L = l2;
l2 = l2->next;
}
struct ListNode* temp = head->next;//记录表的第一个有效值的位置
if (flag)//如果说前面还有溢出没处理,那我们就要多加一位了,这时用head来记录,比如9 9 9 和1,完成上面的变成了0 0 0 还少一个1
{
L->next = head;//将head接上
head->next =NULL;//head变成最后一个结点
flag = 0;//清除标志位
}
return temp;
}
完整代码
#include<stdio.h>
#include<stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2);
void print(struct ListNode *l)
{
while(l)
{
printf("%d", l->val);
l = l->next;
}
}
void Delete(struct ListNode *L)
{
struct ListNode* p = L;
while(p)
{
L = p->next;
free(p);
p = L;
}
}
struct ListNode* Create(void)
{
struct ListNode *l = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *head = l;
int a = 0;
scanf("%d", &a);
l->val = a;
l->next = NULL;
while(scanf("%d", &a))//输入非数字结束
{
struct ListNode *p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val = a;
p->next = NULL;
head->next = p;
head = p;
}
return l;
}
int main(void)
{
struct ListNode *l1 = (struct ListNode*)malloc(sizeof(struct ListNode));
l1 = Create();
while(getchar() != '\n')
continue;
struct ListNode *l2 = (struct ListNode*)malloc(sizeof(struct ListNode));
l2 = Create();
print(addTwoNumbers(l1,l2));
return 0;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->val = 1;//头结点可用于保存最后一个位置溢出的1,比如,1 与 9 是0 1
head->next = NULL;
struct ListNode* L = head;
int flag = 0;//溢出标志位
while (l1 && l2)
{
struct ListNode *p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = NULL;
p->val = l1->val + l2->val;
if (flag)//如果上一位有溢出,那就下一位加一个
{
p->val++;
flag = 0;
}
if (p->val > 9)//如果之和大于10,那就溢出置1,且取余
{
flag = 1;
p->val %= 10;
}
L->next = p;
L = p;
l1 = l1->next;
l2 = l2->next;
}
if (l1)//如果l1还有那就接上l1
L->next = l1;
while (l1)//当新链表还有溢出位没有清理时比如,l1是9 9 9 ,l2是1,上面我们的链表变成了0 现在l1还有9 9 没处理
{
if (flag)
{
l1->val++;//
flag = 0;
}
if (l1->val > 9)
{
l1->val %= 10;
flag = 1;
}
L = l1; //L也移动,直到L1的的下一个是null
l1 = l1->next;
}
if (l2)
L->next = l2;
while (l2)
{
if (flag)
{
l2->val++;
flag = 0;
}
if (l2->val > 9)
{
l2->val %= 10;
flag = 1;
}
L = l2;
l2 = l2->next;
}
struct ListNode* temp = head->next;//记录表的第一个有效值的位置
if (flag)//如果说前面还有溢出没处理,那我们就要多加一位了,这时用head来记录,比如9 9 9 和1,完成上面的变成了0 0 0 还少一个1
{
L->next = head;//将head接上
head->next =NULL;//head变成最后一个结点
flag = 0;//清除标志位
}
return temp;
}