题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
实例
思路
将两个链表补成长度一致的,短的在后边补零。注意的是最后一位相加可能产生进位。
my code
/**
* 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 *l3 = new ListNode(-1);
ListNode *p = l1; ListNode* q = l2; ListNode* w = l3;
int temp = 0;
while(p->next || q->next){
if(p->next&&q->next){
p = p->next;
q = q->next;
}
if(p->next == nullptr && q->next){
p->next = new ListNode(0);
p = p->next;
q = q->next;
}
if(p->next && q->next == nullptr){
q->next = new ListNode(0);
q = q->next;
p = p->next;
}
}
// 用下面这段代码总是不能ac, 原因是当p指向nullptr时候,再给他分配值就是另找堆内存分配,不会连在原来的链表上,所以补零不起作用,应该用p->next来写
// while(p || q){
// if(p&&q){
// p = p->next;
// q = q->next;
// }
// if(p == nullptr && q){
// p = new ListNode(0);
// p = p->next;
// q = q->next;
// }
// if(p && q == nullptr){
// q = new ListNode(0);
// q = q->next;
// p = p->next;
// }
// }
p = l1; q = l2;
while(p&&q)
{
int add = p->val + q->val;
w->next = new ListNode((add+temp)%10);
temp = (add + temp) > 9 ? 1 : 0;
p = p->next;
q = q->next;
w = w->next;
}
if(temp == 1){
w -> next = new ListNode(1);
w = w->next;}
return l3 -> next;
}
};