Example 3:
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,0,0,0,1]
Constraints:
The number of nodes in each linked list is in the range [1, 100].
0 <= Node.val <= 9
It is guaranteed that the list represents a number that does not have leading zeros.
两个链表代表2个数字,数字是逆序的,也就是低位在左边,高位在右边,求两数字的和。
思路:
求和一般会涉及到进位,进位是从低位向高位进的。
本题低位在左边,高位在右边,所以进位是向右。
剩下就是正常加法,两个链表当前node的值相加,再加上进位;因为0 <= Node.val <= 9,所以取个位作为和的node,十位作为进位加到下一步。
当链表长度不一致时,剩下的一段只需要和进位相加即可。
最后,不要忘了最高位的1。
大致流程如下:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int add = 0;
ListNode head = new ListNode();
ListNode tmp = head;
//l1,l2都有数字
while(l1 != null && l2 != null) {
int num = l1.val + l2.val + add;
if(num > 9) {
add = 1;
num -= 10;
} else {
add = 0;
}
ListNode node = new ListNode(num);
tmp.next = node;
l1 = l1.next;
l2 = l2.next;
tmp = tmp.next;
}
//剩下l1的一段
while(l1 != null) {
int num = l1.val + add;
if(num > 9) {
add = 1;
num -= 10;
} else {
add = 0;
}
ListNode node = new ListNode(num);
tmp.next = node;
l1 = l1.next;
tmp = tmp.next;
}
//剩下l2的一段
while(l2 != null) {
int num = l2.val + add;
if(num > 9) {
add = 1;
num -= 10;
} else {
add = 0;
}
ListNode node = new ListNode(num);
tmp.next = node;
l2 = l2.next;
tmp = tmp.next;
}
//不要忘了最高位
if(add > 0) {
ListNode node = new ListNode(add);
tmp.next = node;
}
return head.next;
}
整理后如下:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int add = 0;
ListNode head = new ListNode();
ListNode tmp = head;
while(l1 != null || l2 != null) {
int num1 = (l1 == null ? 0 : l1.val);
int num2 = (l2 == null ? 0 : l2.val);
int num = num1 + num2 + add;
if(num > 9) {
add = 1;
num %= 10;
} else {
add = 0;
}
ListNode node = new ListNode(num);
tmp.next = node;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
tmp = tmp.next;
}
if(add > 0) {
tmp.next = new ListNode(add);
}
return head.next;
}