龙哥主动看的第一道算法题,必须安排一篇博客
java语言实现,击败100%


题目

刷穿力扣 | 2. 两数相加_空指针

难度:中等

思路

两个链表,每一个节点就是一位数字,然后相加,两个小于10的数字相加,有两种可能。


  • 大于等于10,需要进位
  • 小于10,不需要进位

运算肯定是从各位开始计算,而题目恰好链表的头节点都是个位的节点,那么我们同时遍历两个链表,遍历过程中的节点就是同一位上的节点,个位、十位、百位、千位。直接相加即可,当然,有可能是10000 + 1,如果链表在那个位上为空,我们当做0来处理即可。

那么如果大于10要进位怎么办,我们可以定义一个变量moreTen,用来记录上一位的计算是不是大于10,如果是的话,本位的计算还要多加一个1。本位计算的时候,如果结果大于10,我们就取个位,然后把变量moreTen置位true即可,如果不是大于十记得把变量moreTen复位。

运算完了之后如果moreTen还是true,那就是类似这种情况99 + 99,最高位应该是1,我们要特殊处理一下。

最后要注意的是,遍历链表的时候不要出现空指针。

代码

class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 哨兵节点,避免首节点为空的校验
ListNode temp = new ListNode(-1);
// 持有哨兵节点的引用
final ListNode ans = temp;
// 上一次的计算结果是否超过了10
boolean moreTen = false;
while (l1 != null || l2 != null) {
// 获取相加的两数,如果为空就当做0处理
int num1 = (l1 == null) ? 0 : l1.val;
int num2 = (l2 == null) ? 0 : l2.val;
// 两数相加的结果,如果上一次运算大于10了需要加上1
int value = (moreTen ? 1 : 0) + num1 + num2;
// 本次运算结果大于10,要取个位数,并把大于10标志位置位true
if (value > 9) {
moreTen = true;
temp.next = new ListNode(value % 10);
} else {
moreTen = false;
temp.next = new ListNode(value);
}
// 计算下一位,注意非空校验
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
temp = temp.next;
}
// 如果最后一次运算大于10,注意最前面还有一个1
if (moreTen) {
temp.next = new ListNode(1);
}
// 返回哨兵节点的下一个节点,即最终结果
return ans.next;
}

}