两数相加
题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。1
-
例如:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807 -
题目解析:
- 每个链表存储的数字从低位开始存储,符合加法运算的规律,直接从头开始遍历链表
- 函数输出也是低位先输出,运行结算书直接从头遍历链表输出结果.
- 考虑计算时链表长度分为三部分:
- 当前位置链表均非null
- 当前位置有一个非null
- 当前位置另一个非null
- 计算时需要处理进位,运算结束依然要判断是否需要处理进位.
代码部分:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode res = new ListNode(0);//链表头结点
//链表的头结点始终保持不动
//遍历都要借助辅助指针
ListNode temp = res;//链表辅助指针
int array = 0;//进位
ListNode temp1 = l1; //l1辅助指针
ListNode temp2 = l2; //l2辅助指针
//都存在
while(temp1 != null && temp2 != null){
int num1 = temp1.val + temp2.val + array;
temp.next = new ListNode(num1%10);
array = num1/10; //更新进位
temp = temp.next;
temp1 = temp1.next;
temp2 = temp2.next;
}
//temp1存在
while(temp1 != null ){
int num1 = temp1.val + array;
temp.next = new ListNode(num1%10);
array = num1/10; //更新进位
temp = temp.next;
temp1 = temp1.next;
}
//temp2存在
while(temp2 != null){
int num1 = array + temp2.val;
temp.next = new ListNode(num1%10);
array = num1/10; //更新进位
temp = temp.next;
temp2 = temp2.next;
}
//处理最后的进位
if(array != 0){
temp.next = new ListNode(array);
}
//输出结果
return res.next;
}
https://leetcode-cn.com/problems/add-two-numbers/ ↩︎