题目大意:使用链表表示的两个整数,计算出其和,以同样的形式返回
考察点:指针,链表
题目描述
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
算法描述
本题实质是一个模拟笔算加法的过程,其考察点有两个:一是链表的使用,二是对于加法运算的理解。
其需要注意的问题主要为:
给定的两个加数位数不同
进位的处理
对于两个加数位数不同,有2种处理方法:一是首先遍历两个加数,将位数不够的加数前补0。对于同样长度的代码,我们就可以直接对位相加。其代码如下:
ListNode *p1 = l1, *p2 = l2;
while (p1 || p2) {
if (p1) p1 = p1 -> next;
else p1 -> next = new ListNode(0), p1 = p1 -> next;
if (p2) p2 = p2 -> next;
else p2 -> next = new ListNode(0), p2 = p2 -> next;
} // 此时l1和l2链表长度已经相同
p1 = l1, p2 = l2;
ListNode *ansHead, *p = NULL;
while (p1 || p2) {
int tp = (p1 -> val) + (p2 -> val);
if (p == NULL) p = new ListNode(tp), ansHead = p;
else p -> next = new ListNode(tp), p = p -> next;
p1 = p1 -> next, p2 = p2 -> next;
} // 在这个循环中,我们没有处理进位
第二种方法,在计算时我们发现一个链表已经为空时,就将对应位置的值默认为0,其代码如下:
p1 = l1, p2 = l2;
ListNode *ansHead, *p = NULL;
while (p1 || p2) {
int tp = 0;
if (p1 != NULL) tp += p1 -> val;
else tp += 0; // 该行语句可以去掉
if (p2 != NULL) tp += p2 -> val;
else tp += 0; // 该行语句可以去掉
if (p == NULL) p = new ListNode(tp), ansHead = p;
else p -> next = new ListNode(tp), p = p -> next;
if (p1 != NULL) p1 = p1 -> next;
if (p2 != NULL) p2 = p2 -> next;
} // 在这个循环中,我们没有处理进位
接下来对已经计算出的链表ansHead进行进位处理:
ListNode *p = ansHead;
while (p) {
if (p -> val >= 10) {
if (p -> next) // 该if语句很重要,主要用于处理最高位的进位
p -> next -> val += (p -> val) / 10;
else p -> next = new ListNode((p -> val) / 10); // 最高位的进位
p -> val %= 10;
}
p = p -> next;
}
当然在第一部对位相加时,同样可以将进位考虑进去,具体的实现可以参考下面的代码:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *ansHead = NULL, *p = NULL;
int carry = 0;
while (l1 || l2 || carry) {
int tp = 0;
if (l1) tp += l1 -> val;
if (l2) tp += l2 -> val;
if (carry) tp += carry;
if (l1) l1 = l1 -> next;
if (l2) l2 = l2 -> next;
if (tp >= 10) carry = 1, tp %= 10;
else carry = 0;
if (p == NULL) p = new ListNode(tp), ansHead = p;
else p -> next = new ListNode(tp), p = p -> next;
}
return ansHead;
}
};