力扣 - 2. 两数相加
题目
思路
- 这个和445. 两数相加 II很像,而且比 445 的简单一点
- 如何控制位数不一样情况下计算?如果短的先到末尾了,但是长的那个还没到,那么我们可以先用0来代替短的那个值,结果是不影响的
- 当两个链表都到达末尾时候,但是carry,即进位是1,那么还需要再计算一次,将进位加上
- 只有三者都不满足条件,才算计算完,跳出循环
代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode();
ListNode p = head;
int carry = 0;
int num1 = 0;
int num2 = 0;
// 只要两个链表有一个不为空或者carry为1,链表就还要再进行计算
while (l1 != null || l2 != null || carry != 0) {
// 如果链表到达末尾了就用0代替
if (l1 != null) {
num1 = l1.val;
l1 = l1.next;
} else {
num1 = 0;
}
if (l2 != null) {
num2 = l2.val;
l2 = l2.next;
} else {
num2 = 0;
}
int total = num1 + num2 + carry;
// 计算进位
carry = total / 10;
// 求余
total %= 10;
ListNode n = new ListNode(total);
p.next = n;
p = p.next;
}
return head.next;
}
}
复杂度分析
- 时间复杂度:\((N)\),其中 N 为
l1 / l2中较长的那个链表的长度 - 空间复杂度:\(O(N)\),其中 N 为新链表的长度
我走得很慢,但我从不后退!

浙公网安备 33010602011771号