1. 题目原址
https://leetcode.com/problems/add-two-numbers-ii/
2. 题目描述
3. 题目大意
给定两个链表,将两个链表对应位置的元素相加。
4. 解题思路
- 首先判断链表是否为空等
- 将两个链表都逆序,因为正常加需要进位到前面,而逆序之后只需要将进位的元素加到后面即可。
- 进行while循环,循环的条件是:两个链表都不为空,将相加的结果放到返回的链表中,然后更新链表的值和更新进位的值
- while循环之后,如果两个原始链表都为空,而进位不为空,我们就需要新new一个节点来存储进位元素。
- 如果有一个链表为空另一个链表不为空,那么就需要将不为空的链表加上进位项来继续向下遍历。
5. AC代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode cur1 = l1, cur2 = l2;
int size1 = 0, size2 = 0;
while (cur1 != null){
size1++;
cur1 = cur1.next;
}
while (cur2 != null){
size2++;
cur2 = cur2.next;
}
if (size1 < size2){
ListNode temp = l1;
l1 = l2;
l2 = temp;
int size = size1;
size1 = size2;
size2 = size;
}
ListNode sumHead = new ListNode(0);
ListNode sumCur = sumHead, sumPre = sumHead;
cur1 = l1;
cur2 = l2;
for (int i = size1 - size2; i > 0; i--){
ListNode sumNode = new ListNode(cur1.val);
sumCur.next = sumNode;
if (sumNode.val < 9){
sumPre = sumNode;
}
sumCur = sumNode;
cur1 = cur1.next;
}
while (cur1 != null){
ListNode sumNode = new ListNode(cur1.val + cur2.val);
sumCur.next = sumNode;
if (sumNode.val >= 10){
sumNode.val -= 10;
sumPre.val += 1;
while (sumPre != sumCur){
sumPre = sumPre.next;
sumPre.val = 0;
}
sumPre = sumNode;
} else if (sumNode.val < 9){
sumPre = sumNode;
}
sumCur = sumNode;
cur1 = cur1.next;
cur2 = cur2.next;
}
return sumHead.val == 0 ? sumHead.next : sumHead;
}
}