题目描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
示例:
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
解析:
热知识:
unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
所以这题别想把链表转为整数,这题实际上考的是大数相加,依靠判断进位建立新节点
代码:
//节点的结构体
/**
* 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)
{
//返回的链表,毕竟不是vector,所以还要另建一个指向这链表的指针
ListNode* ans = new ListNode();
ListNode* first = ans;
//两链表没读完需要继续读
while(l1!=nullptr||l2!=nullptr)
{
int x = 0, y = 0;
//获取最新的节点,如果不为空节点则选入并指向下一个节点
if(l1 != nullptr)
{
x = l1->val;
l1 = l1->next;
}
if (l2 != nullptr)
{
y = l2->val;
l2 = l2->next;
}
int sum = x + y + ans->val;
ans->val = sum % 10;
//当存在进位或未读完两条链表时(以防0,0的情况)需要建立新的节点
if(sum/10||(l1 != nullptr || l2 != nullptr))
{
ListNode* next = new ListNode(sum/10);
ans->next = next;
ans = ans->next;
}
}
return first;
}
};