链表模拟加法问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ssjhust123/article/details/7978337

题目描述

给定两个链表,每个链表的结点值为数字的各位上的数字,试求出两个链表所表示数字的和,并将结果以链表形式返回。

链表的结点定义如下:

typedef struct node *pNode;
struct node
{
	int data;
	struct node *next;
};

题目有点拗口,请看一个例子:

假定两个链表分别为list1和list2,list1各个结点值分别为数字513的个位、十位和百位上的数字,同理list2的各个结点值为数字295的各个位上的数字。则这两个数相加为808,所以输出按照从个位到百位顺序输出,返回的结果链表如下。

list1:  (3 -> 1 -> 5)

list2:  (5 -> 9 -> 2)

result:(8 -> 0 ->8)

 

分析

这个题目比较有意思,需要对链表操作比较熟练。我们考虑两个数字相加过程,从低位到高位依次相加,如果有进位则标记进位标志,直到最高位才终止。设当前位的结点为current,则有:

current->data = list1->data + list2->data + carry(低位的进位,如果有进位为1,否则为0)

使用递归来解决这个问题,代码如下:

pNode addLists(pNode list1, pNode list2, int carry) {
	if (!list1 && !list2 && !carry)
		return NULL;
	pNode result = newNode(carry);
	int value = carry;
	if (list1)
		value += list1->data;
	if (list2)
		value += list2->data;
	result->data = value % 10;
	pNode more = addLists(list1?list1->next:NULL, list2?list2->next:NULL, value>=10?1:0);
	result->next = more;
	return result;
}


 


 

没有更多推荐了,返回首页