每日一练 - 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
个人感觉难点在于,对加数的进位,要充分利用好%运算
public ListNode addTwoNumbers (ListNode node1, ListNode node2){
ListNode first = null,next = null;
/* 据题目了解node1与node2顺序一致都是逆序,所以我们可以直接进行相加,只需要保证正确进位就行 */
//定义一个进位值
int carry = 0;
while(null != node1 || null != node2){
/* 标记计算值 */
int num1 = node1 != null ? node1.val : 0;
int num2 = node2 != null ? node2.val : 0;
int sumNum = num1 + num2 + carry;
if(null == first){
first = next = new ListNode(sumNum%10);
}else{
next.nextVal = new ListNode(sumNum%10);
next = next.nextVal;
}
/* 进位处理 */
carry = sumNum/10;
/* 获取下一个值 */
if(null != node1){
node1 = node1.nextVal;
}
if(null != node2){
node2 = node2.nextVal;
}
}
/* 判断最后一次相加之后是否需要进位 */
if(carry > 0){
next.nextVal = new ListNode(carry);
}
return first;
}
class ListNode{
private Integer val;
private ListNode nextVal;
ListNode(Integer val) {
this.val = val;
}
public Integer getVal() {
return val;
}
public void setVal(Integer val) {
this.val = val;
}
public ListNode getNextVal() {
return nextVal;
}
public void setNextVal(ListNode nextVal) {
this.nextVal = nextVal;
}
}