Leetcode Algorithm 002. Add Two Numbers
Add Two Numbers
用两个非空的链表表示两个非负整数,数字在链表中是逆向排列的,求这两个整数的和,并且用这样的链表表示出来。(整数中没有如“001”之类的前导0。)
解题思路
首先分析一下链表如何表示一个整数,下面结合题中的样例说明。
342:2→4→3→NULL
465:5→6→4→NULL
那么,逆序整数数位链表的加法便可以等同于从整数低位开始相加,也就是我们小学所学到的两个整数的竖式笔算规则:
- 从个位开始,同位相加
- 满十进一,写和的个位数
在程序中,我们首先需要注意以下几个方面
- 链表的操作:遍历,节点的创建,链表节点的连接;
- 实现“满十进一”的规则,需要保留进位,以供下一位的加法所用;
- 某个链表若已遍历结束,则只需遍历完另外一个链表即可;
- 两个链表若都遍历结束,最后如果有进位,则要创建一个新的节点,存进结果链表中。
代码与测试样例
#include <iostream>
#include <vector>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
ListNode* buildList(int array[], int number) {
ListNode* list = new ListNode(array[0]);
for (int i = 1; i < number; i++) {
ListNode* p = new ListNode(array[i]);
p->next = list;
list = p;
}
return list;
}
void printList(ListNode* list) {
ListNode* p = list;
while (p != NULL) {
cout << p->val << "->";
p = p->next;
}
cout << "NULL" << endl;
}
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* p1 = l1;
ListNode* p2 = l2;
int node_sum = p1->val + p2->val;
int node_val = node_sum % 10;
node_sum = node_sum / 10;
ListNode* result = new ListNode(node_val);
ListNode* p_result = result;
p1 = p1->next;
p2 = p2->next;
while (p1 != NULL || p2 != NULL){
if (p1 != NULL){
node_sum += p1->val;
p1 = p1->next;
}
if (p2 != NULL){
node_sum += p2->val;
p2 = p2->next;
}
node_val = node_sum % 10;
node_sum = node_sum / 10;
p_result->next = new ListNode(node_val);
p_result = p_result->next;
}
if (node_sum !=0){
p_result->next = new ListNode(node_sum);
}
return result;
}
};
int main() {
// 342 + 465 = 807
int a1[] = { 3, 4, 2 };
int a2[] = { 4, 6, 5 };
int m = 3, n = 3;
ListNode* l1 = buildList(a1, m);
ListNode* l2 = buildList(a2, n);
Solution s;
ListNode* result = s.addTwoNumbers(l1, l2);
printList(l1);
printList(l2);
printList(result);
return 0;
}
输出
2->4->3->NULL
5->6->4->NULL
7->0->8->NULL
知识点
总结一下链表的使用技巧,大家可以在链表创建的过程中体会链表的节点是如何连接的。
链表的创建
// 从链表头创建
ListNode* buildListFromHead(int array[], int number) {
ListNode* list = new ListNode(array[0]);
for (int i = 1; i < number; i++) {
list->next = new ListNode(array[i]);
list = list->next;
}
return list;
}
// 从链表尾创建
ListNode* buildListFromTail(int array[], int number) {
ListNode* list = new ListNode(array[0]);
for (int i = 1; i < number; i++) {
ListNode* p = new ListNode(array[i]);
p->next = list;
list = p;
}
return list;
}
链表的遍历
void printList(ListNode* list) {
ListNode* p = list;
while (p != NULL) {
cout << p->val << "->";
p = p->next;
}
cout << "NULL" << endl;
}