原题目:
You are given two non-empty linked lists representing two non-negative integers. 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.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
题目大意如下:
将两个用非空链表逆序表示的数字加起来,每个节点包含十进制数的一个位。最后将答案以链表形式返回。
解题思路:
大致类似于竖式加法的算法,用到了一点归并的思想。测试样例中有需要注意的比如【1】和【9,9】,一定要注意连续的进位。【5,5】,要注意当计算完成时是否依然有进位。
代码如下:
/**
* 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* p = l1 ;
ListNode* q = l2 ;
int m = p->val + q->val ; //m表示进位
int n ; //n表示当前位对应加起来的结果
ListNode* ans = new ListNode(m%10) ; //首先单独构造个位结果
ListNode* rear = ans ;
p = p->next ;
q = q->next ;
//如果只有个位相加,计算结束,但需要另外判断是否有进位
if(q == NULL && p == NULL && m/10) rear->next = new ListNode(1) ;
while(p != NULL && q != NULL){
n = p->val + q->val ;
//每一位计算结果=当前结果+进位(0或1),再取余
rear->next = new ListNode((n + m/10)%10) ;
rear = rear->next ;
p = p->next ;
q = q->next ;
m = n + m/10 ; //更新进位
//同样,如果当计算结束的时候还有进位,也要写出来
if(q == NULL && p == NULL && m/10) rear->next = new ListNode(1) ;
}
//当其中有一个数字位数计算完成时
while(p != NULL){
//依然要考虑前面的进位和当计算完成时是否有进位
rear->next = new ListNode((p->val + m/10)%10) ;
rear = rear->next ;
m = p->val + m/10 ;
p = p->next ;
if(p == NULL && m/10) rear->next = new ListNode(1) ;
}
while(q != NULL){
rear->next = new ListNode((q->val + m/10)%10) ;
rear = rear->next ;
m = q->val + m/10 ;
q = q->next ;
if(q == NULL && m/10) rear->next = new ListNode(1) ;
}
return ans ;
}
};
运行结果: