题目描述
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
题解
坑:这题只能逐位计算,不能把链表整个直接转为一个整体 int 来计算,因为给的测试用例会溢出,求和会导致溢出。
逐位计算的话,我们希望的是从低位到高位遍历,求和之后的进位可以记录下来,用于下一位遍历的求和。但是题目链表给的是从高位到低位的顺序,所以我们必须先想办法,让我们能从低位到高位遍历。
我的做法是遍历一遍两个链表,然后把数字存在List中,这样我们就可以从任意方向遍历每一位了(也就可以从低位到高位遍历了)。
执行用时:2 ms, 在所有 Java 提交中击败了98.96%的用户
内存消耗:38.7 MB, 在所有 Java 提交中击败了59.70%的用户
通过测试用例:1563 / 1563
import java.util.ArrayList;
import java.util.List;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 1.取出两个链表的数字存为序列
// l1 = [7,2,4,3], l2 = [5,6,4]
// list1 = [7,2,4,3], list2 = [5,6,4]
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
while (l1 != null) {
list1.add(l1.val);
l1 = l1.next;
}
while (l2 != null) {
list2.add(l2.val);
l2 = l2.next;
}
// 2.准备遍历
ListNode res = new ListNode(-1);
int index1 = list1.size() - 1;
int index2 = list2.size() - 1;
int carry = 0; // 进位记录
// 3.两链表数字相加,记录进位carry,相加结果存储到链表
while (index1 >= 0 || index2 >= 0 || carry != 0) {
int tempSum = 0;
int val1 = 0;
int val2 = 0;
if (index1 >= 0) {
val1 = list1.get(index1);
index1--;
}
if (index2 >= 0) {
val2 = list2.get(index2);
index2--;
}
tempSum = val1 + val2 + carry;
int low = tempSum % 10;
int high = tempSum / 10;
carry = high;
ListNode temp = new ListNode(low);
temp.next = res.next;
res.next = temp;
}
return res.next;
}
}