标签:leetcode
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>
标签:leetcode
原文地址:http://blog.csdn.net/yujin753/article/details/42298635