题意
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
思路
- 因为链表也不知道多长,如果选择各自遍历得到值再相加,然后再生成新的链表的话,可能会超出数值类型的精度范围(Python 不会,所以有提供者 python 的对应代码)
- 所以更为通用的解法应该是
- 同时遍历
l1
和l2
- 模拟进行加法,注意要带上低位来的进位
- 同时遍历
- ⚠️细节
- 最高位仍有可能进位,这个要额外处理
Java
代码
// 边扫描边做
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
dummy.next = null;
ListNode pos = dummy;
int remainder = 0;
while(l1 != null || l2 != null) {
int x = 0, y = 0;
if(l1 != null) {
x = l1.val;
l1 = l1.next;
}
if(l2 != null) {
y = l2.val;
l2 = l2.next;
}
int sum = x + y + remainder;
ListNode newNode = new ListNode(sum % 10);
pos.next = newNode;
pos = pos.next;
remainder = sum / 10;
}
if(remainder > 0) {
ListNode newNode = new ListNode(remainder);
pos.next = newNode;
pos = pos.next;
pos.next = null;
} else {
pos.next = null;
}
return dummy.next;
}
}
python
代码
# 边扫描边计算
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode(0)
pos = dummy;
remainder = 0
while l1 or l2:
x = l1.val if l1 else 0
y = l2.val if l2 else 0
if l1: l1 = l1.next
if l2: l2 = l2.next
sum = x + y + remainder
new_node = ListNode(sum % 10)
remainder = sum // 10
pos.next = new_node
pos = pos.next
if remainder > 0:
new_node = ListNode(remainder)
pos.next = new_node
pos = pos.next
pos.next = None
else:
pos.next = None
return dummy.next
# 各自得到结果再相加
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def get_value(cur):
value_list, value = [], 0
while cur:
value_list.append(cur.val)
cur = cur.next
for num in value_list[::-1]:
value *= 10
value += num
return value
add_value = get_value(l1) + get_value(l2)
if add_value == 0: return ListNode(0)
dummy = ListNode(0)
pos = dummy
while add_value:
val = add_value % 10
add_value = add_value // 10
new_node = ListNode(val)
pos.next = new_node
pos = pos.next
return dummy.next