给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例图如下图所示:
定义struct结构体存放指针域和指针next;
需要注意以下几点:
1 将长度较短的链表在末尾补零使得两个连表长度相等,再一个一个元素对其相加(考虑进位)
2 获取两个链表所对应的长度
3 在较短的链表末尾补零
4 对齐相加考虑进位
定义头尾部结点置为空。定义int型变量carry用来存储进位值。
使两个链表不为空为循环条件,将变量n1 n2以两条链表头节点为值,进行求和sum,如果头节点为零,则开辟一个空间,尾部值使它是总和的余数,并将next域置空;
如果头节点不为零,则开辟空间给tail-next的值赋值为余数,并且tail指向tail->next,carry的值赋值为sum除10,遍历l1 l2两条链表。
第一轮循环:
head=tail=NULL;
l1 分别为2 4 3
l2 分别为5 6 4
n1=2; n2=5; sum=7; tail->val=7; carry=7/10=0;
第二轮循环:
n1=4; n2=6; sum=10; tail->next->val=0; carry=1;
第三轮循环:
n1=3; n2=4; sum=7+1=8; tail->next->val=8; carry=0;
打印输出,tail->val的值并由他指向next分别输出7 0 8;
#include <stdio.h>
#include <malloc.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode*head=NULL,*tail=NULL;
int carry=0;
while(l1||l2){
int n1=l1?l1->val:0;
int n2=l2?l2->val:0;
int sum=n1+n2+carry;
if(!head){
head=tail=malloc(sizeof(struct ListNode));
tail->val=sum%10;
tail->next=NULL;
}
else{
tail->next=malloc(sizeof(struct ListNode));
tail->next->val=sum%10;
tail=tail->next;
tail->next=NULL;
}
carry=sum/10;
if(l1){
l1=l1->next;
}
if(l2){
l2=l2->next;
}
}
if(carry>0){
tail->next=malloc(sizeof(struct ListNode));
tail->next->val=carry;
tail->next->next=NULL;
}
return head;
}
int main() {
struct ListNode* node1= malloc(sizeof (struct ListNode));
struct ListNode* node2= malloc(sizeof (struct ListNode));
struct ListNode* node3= malloc(sizeof (struct ListNode));
struct ListNode* node4= malloc(sizeof (struct ListNode));
struct ListNode* node5= malloc(sizeof (struct ListNode));
struct ListNode* node6= malloc(sizeof (struct ListNode));
node1->val=2;
node2->val=4;
node3->val=3;
node4->val=5;
node5->val=6;
node6->val=4;
node1->next=node2;
node2->next=node3;
node3->next=NULL;
node4->next=node5;
node5->next=node6;
node6->next=NULL;
struct ListNode* newhead= addTwoNumbers(node1,node4);
while (newhead){
printf("%d ",newhead->val);
newhead=newhead->next;
}
return 0;
}