/**
* 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) {
int flag = 0;
int count = 0;
ListNode ans = new ListNode(0);
ListNode now = ans;
while(l1 != null || l2 != null) {
int add1 = l1 == null? 0 : l1.val;
int add2 = l2 == null? 0 : l2.val;
int sum = add1 + add2 + flag;
flag = sum/10;
sum = sum%10;
if(count == 0) ans.val = sum;
else {
ListNode newNode = new ListNode(sum);
now.next = newNode;
now = newNode;
}
count++;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
if(flag != 0) {
ListNode newNode = new ListNode(flag);
now.next = newNode;
now = newNode;
}
return ans;
}
}
今天是一道中等题。实际上也不算很难,对链表结构有所了解基本上就可以处理。
看完题目。发现,欸,还是加法。这跟前几次的字符串加法,大数加法那些其实都差不多。而且,题目还很贴心,甚至链表都是倒序的。那就不需要再多处理什么,直接相加就行了。但,和字符串加法相同,都会出现两个数长度(位数)不一样的情况,所以需要判断,如果低位加完了,就使用0补高位。由于要返回链表头,所以链表头创建完就不要动了,用now来代替移动。只要l1或l2没有结束,就说明还要继续处理,进循环之后先判断,如果l1(l2)是空的,说明已经加完了,之后的位数需要使用0来补足。后面就是常规的计算了。加上前一位的进位就可以计算出这个位相加的结果。使用/10%10的基本操作来判断进位和余数。最后,如果加完flag还有数值,就说明有高进位,再处理一次就行了。(因为加法不可能产生n+2位数)。
虽说是中等题,实际上不难,大家争取拿下。如果有更好的解法也可以发在评论区。