题目传送门
描述给定两个用链表表示非负整数(没有前导0,除了0本身这个数),求两个整数之和。 其中链表的每个节点从低位到高位的顺序存储整数的各位数字。输入
输入两个整数对应的链表元素,其中-1为该链表结束标志,不存入链表。输出
输出两数相加后对应的链表,格式见样例。样例输入
1 2 3 -1 3 9 5 -1样例输出
4->1->9解题思路
根据输入利用头插法创建两个单链表,然后把它们相加即可。 需要注意的就是两者val值相加时会超过10,这时候需要判断进位。 详情见代码。代码
#include#include #include 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; //当其中一个不为NULL 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; }



