题目描述
给定两个链表,每个链表的结点值为数字的各位上的数字,试求出两个链表所表示数字的和,并将结果以链表形式返回。
链表的结点定义如下:
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;
}