题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解答
方法一:自己拼凑的写法:
自己总结需要解决四个问题:
- 初始判断是否为空问题
- 返回的链表的迭代问题
- 当前值大于10下一个值加一,并且记录当前值的问题
- 如何循环,怎样跳出循环的问题
总结来说,写法十分啰嗦,但清晰明了
import java.util.List;
public class Test2 {
public static void bLPrint(ListNode l){
while(l != null){
System.out.println(l.val);
l = l.next;
}
}
public static void main(String[] args) {
//先创建l1:
//l1:2->lt:4-> :3
ListNode l1 = new ListNode(2);
l1.next = new ListNode(6);
ListNode lt = l1.next;
lt.next = new ListNode(3);
//创建l2:
//l1:5->lt:6-> :4
ListNode l2 = new ListNode(5);
l2.next = new ListNode(6);
lt = l2.next;
lt.next = new ListNode(4);
ListNode l3 = addTwoNumbers(l1, l2);
bLPrint(l3);
}
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//初始判断是否为空问题
//判断传递参数是否为空:
if(l1 == null&&l2 == null){
return null;
}
if(l1 == null){//如果l1为空则创建新的为0的节点
l1 = new ListNode(0);
}
if(l2 == null){//如果l2为空则创建新的为0的节点
l2 = new ListNode(0);
}
//新建链表的迭代问题
//返回类型是链表,因此新建链表
ListNode l3 = new ListNode(0);
//循环遍历链表:创建l3
ListNode lt;//lt作为下一个节点
lt = l3;
boolean isTen = false;
while(true){//若l1或l2的指向不为空,则遍历
lt.val += l1.val+l2.val;//将这两个的值赋给lt
//当前值为10下一个值加一问题
if(lt.val >= 10){//若lt.val为10,则标记下一个为1,当前值为0
lt.val -= 10;
lt.next = new ListNode(1);
isTen = true;
}
//循环和指向下个节点问题
if(l1.next != null||l2.next != null||isTen){//若三者有一个不为空则还可以往下走,即可循环条件满足
if(l1.next == null){//如果l1的下一个为空则创建新的为0的节点
l1.next = new ListNode(0);
}
if(l2.next == null){//如果l1的下一个为空则创建新的为0的节点
l2.next = new ListNode(0);
}
if(!isTen){
lt.next = new ListNode(0);
}else {
isTen = false;
}
//将所有节点指向下一个
lt = lt.next;
l1 = l1.next;
l2 = l2.next;
}else{//只有两个同时为空才会跳出循环,可循环条件不满足
return l3;
}
}
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
方法二:借鉴评论中解法:
与上个解法不同的是,用空间换时间。
判断l1和l2中节点数目是否相等,若不相等则将数目少的一方新增节点直到相等,最后统计节点数量,为返回值链表创建做基础。
创建返回值链表即与上方法相同,判断是否本节点值大于10,并且做出相应的处理。
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1 == null&&l2 != null){//若l1为空,则l1创建新节点,新节点为0
l1 = new ListNode(0);
}else if(l1 != null&&l2 == null){
l2 = new ListNode(0);
}else if(l1 == null&&l2 == null){
return null;
}
ListNode ll1 = l1;
ListNode ll2 = l2;
int size = 0;
while(l1 != null||l2 != null){//创造两节点数量相等,并且计算每个链表有几个节点
if(l1.next == null&&l2.next != null){//若l1为空,则l1创建新节点,新节点为0
l1.next = new ListNode(0);
}else if(l1.next != null&&l2.next == null){
l2.next = new ListNode(0);
}
l1 = l1.next;
l2 = l2.next;
size++;
}
//新建链表,为返回值
ListNode l3 = new ListNode(0);
ListNode ln;//ln为被迭代对象
ln = l3;
for(int i = 0;i<size;i++){
ln.val += ll1.val + ll2.val;//两数相加赋值
if(ln.val>=10){
ln.val-=10;
ln.next = new ListNode(1);
}else{
if(ll1.next != null){//说明还有后续,则新建下一节点
ln.next = new ListNode(0);
}else{
break;
}
}
//将所有节点指向下一个
ln = ln.next;
ll1 = ll1.next;
ll2 = ll2.next;
}
return l3;
}