1.读题
a.倒序的两个链表,均不为空。
b.数据格式除了0以外开头不能为0。
2.思路
和数据结构选择的大作业类似,大整数加减,不过逆序无需构造循环链表。
3.反思
解题步骤清楚,但是变量的放置位置很有讲究,本来想对个位数做统一处理,发现逻辑上就有问题,因为,涉及到:
a.个位数加个位数,可能不进位的情况。
b.统一的流程只能是有一者或者两者指针移动的循环控制流,两者唯一确定的是都有个位,头结点必须保留作为返回值。
4.注意点和异常处理
a.指针移动要统一。
b.位数不对齐,时刻要考虑,一个链表为空,一个不为空的情况。
c.最后对进位统一处理。
5.代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *sum=new ListNode((l1->val+l2->val)%10);
int carry = (l1->val+l2->val)/10;
ListNode* cur = sum;
ListNode* pn1 = l1->next;
ListNode* pn2 = l2->next;
while(pn1!=NULL||pn2!=NULL)
{
while(pn1!=NULL&&pn2!=NULL)
{
ListNode *point = new ListNode((pn1->val+pn2->val+carry)%10);
carry = (pn1->val+pn2->val+carry)/10;
cur->next = point;
cur = cur->next;
pn1 = pn1->next;
pn2 = pn2->next;
}
if(pn1!=NULL)
{
ListNode *point = new ListNode((pn1->val+carry)%10);
carry = (pn1->val+carry)/10;
cur->next = point;
cur = cur->next;
pn1 = pn1->next;
}
if(pn2!=NULL)
{
ListNode *point = new ListNode((pn2->val+carry)%10);
carry = (pn2->val+carry)/10;
cur->next = point;
cur = cur->next;
pn2 = pn2->next;
}
}
if(carry!=0)
{
ListNode *point = new ListNode(1);
cur->next = point;
cur = cur->next;
}
return sum;
}
};