题目:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:
1.在处理链表的时候, ListNode temp = sum; 中的temp 和sum 可以理解为指针,所以,每次新new 一个sum的话,指向的对象肯定就变化了,所以new的时候只能new ,sum.next。
2.忘了怎么处理怎么到达表头了,这个很简单,直接定义两个变量指向表头,每次只改变一个,所以另一个一直都在表头的位置。
关键代码:
方法一:
//1.链表的相应位以及前进位值相加,并求出下一进位值,其中如果一个链表的相应结点为空,则用值为0的ListNode代替;相当于先对数据进行处理,然后进行计算
public ListNode addTwoNumbers(ListNode l1,ListNode l2)
{
//表示带头结点的链表
ListNode sum=new ListNode(0);
//用于始终指向链表头部
ListNode head=sum;
//用来表示进位
int flag=0;
//l1,l2,flag若有一个不为空则都进入循环
while(l1!=null||l2!=null||flag!=0)
{
//对l1,l2的相应结点处理
l1=l1!=null?l1:new ListNode(0);
l2=l2!=null?l2:new ListNode(0);
//是否进位的不同处理
if(l1.val+l2.val+flag<10)
{
sum.next=new ListNode(l1.val+l2.val+flag);
sum=sum.next;
flag=0;
}else{
sum.next=new ListNode(l1.val+l2.val-10+flag);
sum=sum.next;
flag=1;
}
//指向链表下一结点
l1=l1.next;
l2=l2.next;
}
return head.next;
}
方法二:
//2.对l1,l2如果为空等的情况分别处理
public ListNode addTwoNumbers(ListNode l1,ListNode l2)
{
//定义带表头的链表
ListNode sum=new ListNode(0);
//指向链表表头
ListNode head=sum;
//进位值
int i=0;
//l1,l2至少一个不为空的情况,内部分3中情况
while(l1!=null||l2!=null)
{
if(l1==null&&l2!=null)
{
sum.next=new ListNode((l2.val+i)%10);
i=l2.val+i>9?1:0;
sum=sum.next;
l2=l2.next;
}
if(l1!=null&&l2==null)
{
sum.next=new ListNode((l1.val+i)%10);
i=l1.val+i>9?1:0;
sum=head.next;
l1=l1.next;
}
if(l1!=null&&l2!=null)
{
sum.next=new ListNode((l1.val+l2.val+i)%10);
i=l1.val+l2.val+i>9?1:0;
sum=sum.next;
l1=l1.next;
l2=l2.next;
}
}
//如果l1,l2为空,但i不为空(即进位值仍不为空)
if(l1==null&&l2==null&&i!=0){
sum.next=new ListNode(1);
}
return head.next;
}
完整代码:
public class SecordTest {
//1.链表的相应位以及前进位值相加,并求出下一进位值,其中如果一个链表的相应结点为空,则用值为0的ListNode代替;相当于先对数据进行处理,然后进行计算
public ListNode addTwoNumbers(ListNode l1,ListNode l2)
{
//表示带头结点的链表
ListNode sum=new ListNode(0);
//用于始终指向链表头部
ListNode head=sum;
//用来表示进位
int flag=0;
//l1,l2,flag若有一个不为空则都进入循环
while(l1!=null||l2!=null||flag!=0)
{
//对l1,l2的相应结点处理
l1=l1!=null?l1:new ListNode(0);
l2=l2!=null?l2:new ListNode(0);
//是否进位的不同处理
if(l1.val+l2.val+flag<10)
{
sum.next=new ListNode(l1.val+l2.val+flag);
sum=sum.next;
flag=0;
}else{
sum.next=new ListNode(l1.val+l2.val-10+flag);
sum=sum.next;
flag=1;
}
//指向链表下一结点
l1=l1.next;
l2=l2.next;
}
return head.next;
}
//2.对l1,l2如果为空等的情况分别处理
/*public ListNode addTwoNumbers(ListNode l1,ListNode l2)
{
//定义带表头的链表
ListNode sum=new ListNode(0);
//指向链表表头
ListNode head=sum;
//进位值
int i=0;
//l1,l2至少一个不为空的情况,内部分3中情况
while(l1!=null||l2!=null)
{
if(l1==null&&l2!=null)
{
sum.next=new ListNode((l2.val+i)%10);
i=l2.val+i>9?1:0;
sum=sum.next;
l2=l2.next;
}
if(l1!=null&&l2==null)
{
sum.next=new ListNode((l1.val+i)%10);
i=l1.val+i>9?1:0;
sum=head.next;
l1=l1.next;
}
if(l1!=null&&l2!=null)
{
sum.next=new ListNode((l1.val+l2.val+i)%10);
i=l1.val+l2.val+i>9?1:0;
sum=sum.next;
l1=l1.next;
l2=l2.next;
}
}
//如果l1,l2为空,但i不为空(即进位值仍不为空)
if(l1==null&&l2==null&&i!=0){
sum.next=new ListNode(1);
}
return head.next;
}*/
public static void main(String[] args)
{
ListNode l1=new ListNode(2);
l1.next=new ListNode(4);
l1.next.next=new ListNode(5);
ListNode l2=new ListNode(5);
l2.next=new ListNode(6);
l2.next.next=new ListNode(4);
//l2.next.next.next=new ListNode(2);
ListNode sum;
sum=new SecordTest().addTwoNumbers(l1, l2);
System.out.println("输出为:");
while(sum!=null)
{
System.out.println(sum.val);
sum=sum.next;
}
}
}
class ListNode{
int val;
ListNode next;
ListNode(int x){
val=x;
};
}