leetcode算法--两数相加

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值