链表A+B
题目传送门
描述
给定两个用链表表示非负整数(没有前导0,除了0本身这个数),求两个整数之和。
其中链表的每个节点从低位到高位的顺序存储整数的各位数字。
输入
输入两个整数对应的链表元素,其中-1为该链表结束标志,不存入链表。
输出
输出两数相加后对应的链表,格式见样例。
样例输入
1 2 3 -1
3 9 5 -1
样例输出
4->1->9
解题思路
根据输入创建无头结点的两个单链表,然后把它们相加即可。
需要注意的就是两者val值相加时会超过10,这时候需要判断进位。
详情见代码。
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
int val;
struct node *next;
}ListNode;
ListNode *CreateLinkList(){
ListNode *head=NULL,*r=NULL,*p;
int x;
while(scanf("%d",&x),x!=-1){
p=(ListNode*)malloc(sizeof(ListNode));
p->val=x;
p->next=NULL;
if(head==NULL){
head=p;
r=p;
}
else{
r->next=p;
r=p;
}
}
return head;
}
ListNode *addTwoNumbers(ListNode *l1,ListNode *l2){
ListNode *p=l1,*q=l2;
ListNode *sum=NULL,*rsum=NULL;
int tmp=0;
while(p || q){
int px=0,qx=0,x=0;
if(p){
px=p->val;
p=p->next;
}
if(q){
qx=q->val;
q=q->next;
}
x=px+qx+tmp;
tmp=x/10;
x%=10;
ListNode *t=(ListNode*)malloc(sizeof(ListNode));
t->val=x;
t->next=NULL;
if(sum==NULL){
sum=t;
rsum=t;
}
else{
rsum->next=t;
rsum=t;
}
}
if(tmp){
ListNode *t=(ListNode*)malloc(sizeof(ListNode));
t->val=tmp;
t->next=NULL;
rsum->next=t;
rsum=t;
}
return sum;
}
void PrintLinkList(ListNode *head)
{
int flag = 0;
ListNode *p = head, *q;
while(p)
{
if(flag)
printf("->");
flag = 1;
printf("%d", p->val);
q = p;
p = p->next;
free(q);
}
printf("\n");
}
int main()
{
ListNode* l1 = CreateLinkList();
ListNode* l2 = CreateLinkList();
ListNode* l3 = addTwoNumbers(l1, l2);
PrintLinkList(l3);
return 0;
}