2. 两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
这道题,利用“反过来进位的思维”,还是挺好想的,直接贴代码吧~~
public class Second {
public static ListNode addTwoNumbers(ListNode l1, ListNode l2){
//end用来操作最后一个链表
//给他个默认值0,其实是没必要的,只是我为了方便才加进去的。到最后这个节点“0”是要去除的
ListNode end = new ListNode(0);
//ret是最终返回的结果
ListNode ret = end;
//用来表示进位部分,如果上一次相加的结果超过10,enter就是1,否则是0
int enter = 0;
//当两个链表都有值的时候
while((l1 != null && l2 != null) ) {
//加上enter,表示进位
int sum = l1.val + l2.val + enter;
int endVal;
if(sum >= 10){
endVal = sum - 10;
enter = 1;
}else{
endVal = sum;
enter = 0;
}
ListNode next = new ListNode(endVal);
end.next = next;
end = next;
l1 = l1.next;
l2 = l2.next;
}
//如果l2链表已经走完了
while(l1 != null){
int sum = l1.val + enter;
int endVal;
if(sum >= 10){
endVal = sum - 10;
enter = 1;
}else{
endVal = sum;
enter = 0;
}
ListNode next = new ListNode(endVal);
end.next = next;
end = next;
l1 = l1.next;
}
//如果l1链表已经走完了
while(l2 != null){
int sum = l2.val + enter;
int endVal;
if(sum >= 10){
endVal = sum - 10;
enter = 1;
}else{
endVal = sum;
enter = 0;
}
ListNode next = new ListNode(endVal);
end.next = next;
end = next;
l2 = l2.next;
}
//如果是[5],[5]的情况下,他的进位是1,这一步是不会让[5]跟[5]的结果变成[0]
//如果到最后的进位为1的话,那么还是要再添加一个节点,值为1,链接到最后
if(enter == 1){
end.next = new ListNode(1);
}
//最后再把一开始那个起始节点除去掉。
if(ret.next != null){
ret = ret.next;
return ret;
}
return null;
}
public static void main(String[] args) {
ListNode l1 = new ListNode(2);
ListNode l2 = new ListNode(4);
ListNode l3 = new ListNode(3);
ListNode l4 = new ListNode(5);
ListNode l5 = new ListNode(3);
l1.next = l2;
l2.next = l3;
l3.next = l4;
l4.next = l5;
ListNode r1 = new ListNode(5);
ListNode r2 = new ListNode(6);
ListNode r3 = new ListNode(4);
r1.next = r2;
r2.next = r3;
ListNode a = addTwoNumbers(l1, r1);
while(a != null){
System.out.println(a.val);
a = a.next;
}
}
}