链表模拟加法问题

题目描述

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

链表的结点定义如下:

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;
}


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值