您的位置:首页 > 其它

链表求和-LintCode

2017-08-16 19:45 267 查看
你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。

样例

给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null

#ifndef C167_H
#define C167_H
#include<iostream>
using namespace std;
struct ListNode{
int val;
ListNode *next;
ListNode(int x) :val(x), next(NULL) {}
};
class Solution {
public:
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
ListNode *addLists(ListNode *l1, ListNode *l2) {
// write your code here
if (l1 == NULL)
return l2;
if (l2 == NULL)
return l1;
ListNode *p = l1, *q = l2;
int len1 = 0, len2 = 0;
ListNode *p1 = l1, *q1 = l2;
while (p1 != NULL)
{
len1++;
p1 = p1->next;
}
while (q1 != NULL)
{
len2++;
q1 = q1->next;
}
bool tag = false;//是否进位
if (len1 >= len2)//比较两者长度
{
while (p != NULL || q != NULL)
{
if (q != NULL)
{
if (tag == false)
p->val = p->val + q->val;
else
p->val = p->val + q->val + 1;
if (p->val >= 10)
{
p->val -= 10;
tag = true;
if (p->next == NULL)
{
p->next = new ListNode(1);
tag = false;
}
}
else
tag = false;
p = p->next;
q = q->next;
}
else
{
if (tag == true)
{
p->val = p->val + 1;
if (p->val == 10)
{
p->val = 0;
tag = true;
if (p->next == NULL)
{
p->next = new ListNode(1);
tag = false;
}
}
else
tag = false;
}
p = p->next;
}
}
return l1;
}
else
{
while (p != NULL || q != NULL)
{
if (p != NULL)
{
if (tag == false)
q->val = p->val + q->val;
else
q->val = p->val + q->val + 1;
if (q->val >= 10)
{
q->val -= 10;
tag = true;
if (q->next == NULL)
{
q->next = new ListNode(1);
tag = false;
}
}
else
tag = false;
p = p->next;
q = q->next;
}
else
{
if (tag == true)

b2ba
{
q->val = q->val+1;
if (q->val  == 10)
{
q->val = 0;
tag = true;
if (q->next == NULL)
{
q->next = new ListNode(1);
tag = false;
}
}
else
tag = false;
}
q = q->next;
}
}
return l2;
}
}
};
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: