leetcode算法题目:两数相加
题目描述:
解析:本题两种方式解决
一种是算出两数相加得出和,再转化为链表,但是这样的话和可能会很大就回导致得到的和无法接受要用到long类型甚至long long类型;
另一种方式:我们可以注意到我们只需将两个链表同时遍历相加将得到的和mod10即可插入到新的链表中,但由于会和会大于10而进1所以我们要设置一个变量carry用来携带进位的数;这样我们把所有可能列出来如下:
1.链表l1比链表l2长,此时l2先结束遍历,当然不能忘了carry
if((l2==null)&&(l1!=null)){
sign.val=(l1.val+carry)%10;
if(l1.val+carry>=10)
carry=1;
else
carry=0;
l1=l1.next;
}
2.链表l2比链表l1长,此时l1先结束遍历,当然还有carry
if((l1==null)&&(l2!=null)){
sign.val=(l2.val+carry)%10;
if(l2.val+carry>=10)
carry=1;
else
carry=0;
l2=l2.next;
}
3.当l1和l2一样长度或者在l1和l2不同长度的时候,前面的遍历是l1和l2同时在遍历,同时不能忘了carry
if((l1!=null)&&(l2!=null)){
sign.val=(l1.val+l2.val+carry)%10;
if(l1.val+l2.val+carry>=10)
carry=1;
else
carry=0;
l1=l1.next;
l2=l2.next;
}
4.当全部遍历完成,此时l1和l2均指向空,此时要盘查carry
if((l1==null)&&(l2==null)){
if(carry==0)
break;
else{
sign.val=1;
break;
}
}
以上是在遍历的时候会出现的四种情况,这四种情况要全部不相交,所以要加入else,让他们不能并列执行,原因是l1和l2的指针遍历;
但此时还不行,应为链表的新建如果在此处的话会在最后生成一个空值的节点,所以我们要判断是否需要生成下一个接收值的节点;
注意此处的if和上面的if并列存在,因为不管上面出现的是那种情况,都要去判断是否生成新的节点。
if((l1==null)&&(l2==null)&&(carry==0)){
break;
}
else{
ListNode n=new ListNode();
sign.next=n;
sign=n;
}
以上我们最后得到的链表result即为最终结果。
附代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int carry=0;
ListNode result=new ListNode();
ListNode sign=new ListNode();
sign=result;
while(true){
if((l1!=null)&&(l2!=null)){
sign.val=(l1.val+l2.val+carry)%10;
if(l1.val+l2.val+carry>=10)
carry=1;
else
carry=0;
l1=l1.next;
l2=l2.next;
}
else if((l1==null)&&(l2!=null)){
sign.val=(l2.val+carry)%10;
if(l2.val+carry>=10)
carry=1;
else
carry=0;
l2=l2.next;
}
else if((l2==null)&&(l1!=null)){
sign.val=(l1.val+carry)%10;
if(l1.val+carry>=10)
carry=1;
else
carry=0;
l1=l1.next;
}
else if((l1==null)&&(l2==null)){
if(carry==0)
break;
else{
sign.val=1;
break;
}
}
if((l1==null)&&(l2==null)&&(carry==0)){
break;
}
else{
ListNode n=new ListNode();
sign.next=n;
sign=n;
}
}
return result;
}
}