给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
拿到题目首先就想到了两个链长度不同的情况,那么就存在:
- 不足补零,直到两个链的指针都为空时退出
- 不补零,有一个为空就退出,然后判断后面的进位情况
一开始想用方法二,但是判断条件特别多,尤其是忽略了[1]和[9,9,9,9]这样要多次进位的情况。
后来选择了方法一。
代码如下:
/**
* 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) {
int dot = 0;
ListNode *p,*q,*L3,*t,*x;
ListNode *s;
L3=(ListNode *)malloc(sizeof(ListNode));
L3->next=NULL;
p = l1;
q = l2;
t = L3;
while(p!=NULL || q!=NULL){
int k;
k = (p->val+q->val+dot)%10; //注意dot要放在括号里面
dot = (p->val+q->val+dot)/10;
s=new ListNode(k); //申请了新的内存才能存数,而且注意得是这种写法,malloc会报错
s->val = k;
t->next = s;
t = s;
if(p->next==NULL&&q->next!=NULL){
x=new ListNode(0); //补零操作
p->next = x;
x->next=NULL;
}
if(q->next==NULL&&p->next!=NULL){
x=new ListNode(0);
q->next = x;
x->next=NULL;
// printf("%d\n",q->next->data);
}
p = p->next;q = q->next;
}
if(p==NULL&&q==NULL&&dot==1){
s=new ListNode(dot);
t->next = s;
}
return L3->next;
}
};