1、对于这个题目,想到的就是。。直接相加然后进位
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL)
{
}
};
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
// 注意这里其实改变了l1 l2的指向内容,此方法存在问题,建议使用第二种
// 用这个存放计算结果
ListNode* pNode = nullptr;
ListNode* pStartNode = nullptr;
int nTarg = 0;
while (l1 && l2)
{
int nValue = l1->val + l2->val + nTarg;
nTarg = nValue / 10;
ListNode* node = new ListNode(nValue % 10);
node->next = nullptr;
if (pNode)
{
pNode->next = node;
}
else
{
pStartNode = node;
}
pNode = node;
l1 = l1->next;
l2 = l2->next;
}
while (l1)
{
int nValue = l1->val + nTarg;
nTarg = nValue / 10;
ListNode* node = new ListNode(nValue % 10);
node->next = nullptr;
if (pNode)
{
pNode->next = node;
}
else
{
pStartNode = node;
}
pNode = node;
l1 = l1->next;
}
while (l2)
{
int nValue = l2->val + nTarg;
nTarg = nValue / 10;
ListNode* node = new ListNode(nValue % 10);
node->next = nullptr;
if (pNode)
{
pNode->next = node;
}
else
{
pStartNode = node;
}
pNode = node;
l2 = l2->next;
}
// 当l1 l2处理完,任存在进位的可能
if (nTarg == 1)
{
ListNode* node = new ListNode(nTarg);
pNode->next = node;
}
return pStartNode;
}
2、把上面代码优化一下
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
// 注意。。我们不能改变l1 l2指针的指向内容
ListNode *p = l1, *q = l2;
// 用这个存放计算结果
ListNode* pNode = nullptr;
ListNode* pStartNode = nullptr;
int nTarg = 0;
while (p || q)
{
int nValue = nTarg;
if (p)
{
nValue += p->val;
p = p->next;
}
if (q)
{
nValue += q->val;
q = q->next;
}
nTarg = nValue / 10;
ListNode* node = new ListNode(nValue % 10);
node->next = nullptr;
if (pNode)
{
pNode->next = node;
}
else
{
pStartNode = node;
}
pNode = node;
}
if (nTarg == 1)
{
ListNode* node = new ListNode(nTarg);
pNode->next = node;
}
return pStartNode;
}
3、对于拓展。。其实很简单,我们使用2个栈,l1、l2分别压入栈s1、s2中,然后出栈计算就行了