有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。
给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。
测试样例:
{1,2,3},{3,2,1}
返回:{4,4,4}
本题的思路很简单,按照小学数学中学习的加法原理从末尾到首位,对每一位对齐相加即可。技巧在于如何处理不同长度的数字,以及进位和最高位的判断。这里对于不同长度的数字,我们通过将较短的数字补0来保证每一位都能相加。尤其是别忘了最高位有可能有进位。
#include<iostream>
using namespace std;
struct ListNode
{
int val;
struct ListNode *next;
ListNode(int x):val(x),next(NULL)
{
}
};
ListNode* PlusAB(ListNode *a, ListNode*b)
{
if(a == NULL)
return b;
if(b == NULL)
return a;
ListNode *pa = a;
ListNode *pb = b;
int step = 0;
int sum = 0;
ListNode *newHead = NULL;
ListNode *pCur = newHead;
while (pa != NULL ||pb != NULL)
{
int Aval = (pa == NULL ? 0 :pa->val);//注意当两个链表不一样长的时候,有一个链表肯定要先走到末尾,不能一直用pa->val或pb->val
int Bval = (pb == NULL ? 0 :pb->val);
sum = Aval + Bval+step;
ListNode *pm = new ListNode(sum%10);
if(newHead == NULL) //新链表的第一个节点
{
newHead = pm;
pCur = newHead;
}
else
{
pCur->next = pm;
pCur = pm;
}
step = sum / 10;
pa = (pa != NULL ? pa->next :NULL);
pb = (pb != NULL ? pb->next :NULL);
}
if(step != 0) //最高位有可能有进位。
{
ListNode *pm = new ListNode(step);
pCur->next = pm;
}
return newHead;
}
void test()
{
ListNode *p1 = new ListNode(6);
ListNode *p2 = new ListNode(5);
ListNode *p3 = new ListNode(4);
p1->next = p2;
p2->next = p3;
ListNode *p4 = new ListNode(3);
ListNode *p5 = new ListNode(2);
ListNode *p6 = new ListNode(1);
p4->next = p5;
p5->next = p6;
ListNode *phead = PlusAB(p1,p4);
while(phead)
{
cout << phead->val << " ";
phead = phead->next;
}
}
int main()
{
test();
cout << "hello..." <<endl;
return 0;
}