leetcode2.两数相加

本文介绍了一种使用链表表示非负整数并实现两数相加的方法。通过两种不同的实现思路,展示了如何处理链表的进位问题及空节点情况。

题目:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
示例:

输入:(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;
    };
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值