1. 题意描述
2. 题意分析
核心主要在于大数相加.
说一说自己的解题历程吧, 刚开始看错了数据范围, 简单地以为两次遍历分别求出每个链表所表示的数之后然后直接相加. 但后来不负众望地超出数据范围了.
后来仔细看了一下数据范围, 其实就是大数相加的问题. 按照大数相加的思路进行计算即可. (大数相加类似于我们小学时学的竖式计算, 一位一位计算, 若有进位向前传递即可)
3. AC Code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
// 核心: 大数加法
ListNode* head = NULL, *cur = NULL, *p1 = l1, *p2 = l2;
int carry = 0;
while (p1 != NULL || p2 != NULL) {
int num1 = 0;
if (p1 != NULL) {
num1 = p1->val;
p1 = p1->next;
}
int num2 = 0;
if (p2 != NULL) {
num2 = p2->val;
p2 = p2->next;
}
int num = (num1 + num2 + carry) % 10;
carry = (num1 + num2 + carry) / 10;
ListNode* tmp = new ListNode;
tmp->val = num; tmp->next = NULL;
if (cur == NULL) {
head = tmp; cur = tmp;
} else {
cur->next = tmp; cur = tmp;
}
}
if (carry != 0){
ListNode* tmp = new ListNode;
tmp->val = carry; tmp->next = NULL;
if (cur == NULL) {
head = tmp; cur = tmp;
} else {
cur->next = tmp; cur = tmp;
}
}
return head;
}
};