Sum the linked lists

Sum the linked lists
1->2->3
4->5

result is 1->6->8

 

1->5->9

5->3

result  2->1->2

A: 把链表的值加起来,注意,根据sample,是从链表的最后一位开始相加,而且,要考虑进位的问题

 

pseudo code如下 (通过编译,但没有测试用例)

View Code
LinkNode* SumLinkLists(LinkNode *p1, LinkNode *p2)
{
if (NULL == p1 && NULL == p2)
return NULL;

if (NULL == p1 && NULL != p2)
return p2;

if (NULL != p1 && NULL == p2)
return p1;

std::stack<LinkNode*> s1;
std::stack<LinkNode*> s2;

LinkNode* t1 = p1;
LinkNode* t2 = p2;

while (t1)
{
s1.push(t1);
t1 = t1->next;
}

while (t2)
{
s2.push(t2);
t2 = t2->next;
}

int sum = 0, carry = 0;
LinkNode* p = new LinkNode();
LinkNode* h = p;

while (!s1.empty() && !s2.empty())
{
t1 = s1.top();
t2 = s2.top();

sum = t1->data + t2->data + carry; // 得到当前结点的和,同时加上进位

if (sum > 10) // 计算需要存储到结点上的'和'及'进位'
{
sum = sum%10;
carry = sum/10;
}

LinkNode* n = new LinkNode();
n->data = sum;

p->next = n;
p = p->next;

s1.pop();
s2.pop();
}

// 将剩余的数据也添加进去
std::stack<LinkNode*> &refL = (!s1.empty())? s1:s2;
while (!refL.empty())
{
sum = refL.top()->data + carry;
if (sum > 10)
{
sum = sum%10;
carry = sum/10;
}

LinkNode* n = new LinkNode();
n->data = sum;
p->next = n;
p = p->next;
refL.pop();
}

p = h->next; // 得到真正的head
delete h;
h = NULL;

// reverse the link list p
// 反转链表
LinkNode* pre = p;
p = p->next;
pre->next = NULL;

while (p)
{
// pre -> p -> nex
LinkNode* n = p->next;

p->next = pre;
pre = p;
p = n;
}

return pre;
}



转载于:https://www.cnblogs.com/yayagamer/archive/2012/01/06/2314132.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值