Description
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//此题考虑要全面:l1和l2两个链表不一定等长;最后两个数相加之后是否为两位数。为减少内存分配,直接把计算结果存放在l1或者l2中即可。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* pt,*s; //pt用来循环,s总是指向pt的后一个位置
pt = l1;
int m,n=0; //m,n分别记录两个数相加之后的个位和十位
while(pt&&l2){
m = pt->val + l2->val + n;
n = m /10;
m = m %10;
pt->val = m;
l2 = l2->next;
s= pt;
pt = pt->next;
}
if(pt){ //l1比l2长
while(pt){
m = pt->val + n;
n = m / 10;
m=m%10;
pt->val = m;
s= pt;
pt = pt->next;
}
}else if(l2){ //l2比l1长
while(l2){
m = l2->val + n;
n = m / 10;
m=m%10;
l2->val = m;
s->next= l2;
s = l2;
l2 = l2->next;
}
}
if(n==1){ //最后两个数相加为两位数,要另外分配一个存储块。
ListNode* p=new ListNode(0);
p->val = n;
p->next = NULL;
s->next = p;
}
return l1;
}
};