第8题:2. Add Two Numbers
题目大意:给定两个非空链表表示两个非负的整数,然后数字存储是反转顺序存储的(如例子中给出的342,存储为2->4->3,不用自己反转了。。。),每个节点只存储单个数字(0-9),相加返回结果。题目明确指出不会有前导0。
问题分析:反转都帮我们做了,那就直接加就完事儿了。数据结构由题目代码给出。具体完整代码如下:
/**
* 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) {
//明确给出了两个非空的链表,但还是做了判断(其实没必要)
if(l1 == NULL && l2 != NULL) return l2;
else if(l1 != NULL && l2 == NULL) return l1;
else if(l1 == NULL && l2 == NULL) return NULL;
else {
int flag = 0;
int tem = l1->val + l2->val + flag;
//受所给数据结构所限,所以只能在new的时候进行赋值
//先将第一位相加
ListNode *res = new ListNode(tem%10);
flag = tem/10; //记录进位
ListNode *p = res;
l1 = l1->next;
l2 = l2->next;
while(l1 != NULL && l2 != NULL){
tem = l1->val + l2->val + flag;
p->next = new ListNode(tem%10);
p = p->next;
flag = tem/10;
l1=l1->next;
l2=l2->next;
}
//长短不一致的处理
while(l1!=NULL){
tem = l1->val + flag;
p->next = new ListNode(tem%10);
p = p->next;
flag = tem/10;
l1=l1->next;
}
while(l2!=NULL){
tem = l2->val + flag;
p->next = new ListNode(tem%10);
p = p->next;
flag = tem/10;
l2=l2->next;
}
if(flag != 0) {
p->next = new ListNode(flag);
}
return res;
}
}
};