You are given two linked lists representing two non-negative numbers. 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.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
题目的意思是将两个链表看成两个数,加起来,类似于整数相加,不过现在每一位用一个链结点表示,注意前面的是数的低位
思路:
定义两个指针p,q 分别遍历两个指针,将每一位 和 前一位的进位相加 ,由于不知道那个链先结束,所以将 两个链的节点都赋予最新的值
更新进位的值, 同时保存 p 和q 然后继续往下遍历 p=p->next,q=q->next
根据有序链表合并思路,将剩下的链节点加上进位 需要注意的是 如果 链结束了还有进位,需要新定义节点(这就是为什么要保存p和q,然后 p=p->next,q=q->next 往下遍历)
代码如下:
<span style="font-size:18px;">/**
* 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)
return l2;
if(l2==NULL)
return l1;
ListNode *p=l1;
ListNode *q=l2;
ListNode *prep=NULL,*preq=NULL;//定义两个指针用来指向p,q的前一个
int temp;//用来保存当前和
int carry=0;//表示进位
while(p&&q)
{
prep=p;
preq=q;
temp=(p->val+q->val+carry);
p->val=temp%10; //由于不知道那条先结束,所以得同时改变两链表的值
q->val=temp%10;
carry=temp/10;
p=p->next;
q=q->next;
}
if(p==NULL&&q==NULL) //表示链表位数相同,p,q都结束了
{
if(carry>0) //表示如果结束后还有进位则需要新建一个节点,注意新建节点,该节点的下一个节点要指向null
{
ListNode *endp=new ListNode(carry);
prep->next=endp; //或者 preq也行
endp->next=NULL;
}
return l1;
}
if(p){ //如果是p还未结束
while(p) //则将p剩下的加上carry
{
temp=p->val+carry;
p->val=temp%10;
carry=temp/10;
prep=p;
p=p->next;
}
if(carry>0) // 表示p结束了 最后还有进位,则需要在p后面再新建一个节点
{
ListNode *endp=new ListNode(carry);
prep->next=endp;
endp->next=NULL;
}
return l1;
}
while(q) //执行到这里,表示上面都没有返回,那么就是q还没有完 将q剩下的加上carry
{
temp=q->val+carry;
q->val=temp%10;
carry=temp/10;
preq=q;
q=q->next;
}
if(carry>0) //同上 表示q结束后还有进位,需要新建一个节点
{
ListNode *endq=new ListNode(carry);
preq->next=endq;
endq->next=NULL;
}
return l2;
}
};</span>