TZOJ 5415: 数据结构实验:链表A+B

链表A+B

题目传送门

描述

给定两个用链表表示非负整数(没有前导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;
}

你可能感兴趣的:(数据结构,链表,数据结构,算法)