两数之和

题目:两数之和

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 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]

提示:

  • 每个链表中的节点数在范围 [1, 100] 内

  • 0 <= Node.val <= 9

  • 题目数据保证列表表示的数字不含前导零

来源:力扣(LeetCode)

解题思路:

​ 这题的思想和高精度类似,都是从低位开始算,然后逐渐进位到高位,只不过这里的用的链表的形式。

​ 在模拟需要注意:

  1. ​ 从低位到高位,逐位相加,如果和大于10,就保留个位,即t % 10
  2. 如果最高位有进位,则在最前面补1

​ 这里还用到了一个做链表题目的小技巧:

​ 添加一个虚拟头节点:ListNode *head = new ListNode(-1);,这样可以不用特判处理完后的链表是否为空,返回的形式都是res -> next

下面是链表进行加入一个数的操作:

1
2
3
ListNode* temp = new ListNode(t % 10);
cur->next = temp;
cur = temp;

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 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) {
auto head = new ListNode(-1), cur = head;

int t = 0;
while (l1 || l2 || t){
if (l1) t += l1->val, l1 = l1->next;
if (l2) t += l2->val, l2 = l2->next;
cur->next = new ListNode(t % 10);
cur = cur->next;
t /= 10;
}

return head->next;
}
};

两数之和
http://example.com/2023/04/22/刷题/两数相加/
作者
Feng Tao
发布于
2023年4月22日
更新于
2023年4月22日
许可协议