LeetCode2.两数相加

 源码+注释:

class solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        return count(l1,l2);
    }

    private ListNode count(ListNode root1,ListNode root2){

        ListNode tempNode1 = root1;
        ListNode tempNode2 = root2;
        int flag = 1;//flag为1则root1为主链,否则root2为主链


        //这个while循环用来判断那个链表比较长,那个链表长,我们就将其作为主链,将另外一条链的数据这和到主链进行返回
        while(tempNode1 != null || tempNode2 != null){
            //判断条链作为结果链返回
            if(tempNode1.next == null && tempNode2.next == null){
                flag = 1;
                //在while循环将要结束时,我们需要再次将tempNode1和tempNode2执行两个链表的根节点,以便后续对这两个链表的使用
                tempNode1 = root1;
                tempNode2 = root2;
                break;
            } else if(tempNode1.next == null){
                flag = 2;
                tempNode1 = root1;
                tempNode2 = root2;
                break;
            }else if(tempNode2.next == null){
                flag  = 1;
                tempNode1 = root1;
                tempNode2 = root2;
                break;
            }else{
                tempNode1 = tempNode1.next;
                tempNode2 = tempNode2.next;
            }

        }

        //根据不同的主链进行不同的处理
        if(flag == 1){

            while(tempNode2 != null){

                int sum = tempNode1.val+tempNode2.val;

                //递归进位
                carry(tempNode1,sum);

                //链表前进
                tempNode2 = tempNode2.next;
                tempNode1 = tempNode1.next;
            }
            return root1;

        }else{
            while(tempNode1 != null){

                int sum = tempNode2.val+tempNode1.val;

                carry(tempNode2,sum);

                //链表前进
                tempNode2 = tempNode2.next;
                tempNode1 = tempNode1.next;

            }

            return root2;
        }
    }


    //递归进位
    private void carry(ListNode node,int data){

        ListNode temp = node;

        if(data<10){
            temp.val = data;
        }else{
            temp.val = data%10;

            if(temp.next != null){
                //递归进位
                carry(temp.next,temp.next.val+data/10);
            }else{
                //如果temp.next为空,则代表当前进位数+下一个节点的数肯定小于十所以,直接创建一个节点,保存当前进位数即可
                temp.next = new ListNode(data/10);
            }
        }
    }
    
    /**    
    //自定义测试方法
    public static void main(String[] args) {

        solution s = new solution();

        ListNode root1 = new ListNode(9);
        root1.next=new ListNode(9);
        root1.next.next = new ListNode(9);

        ListNode root2 = new ListNode(1);
        root2.next=new ListNode(1);
        root2.next.next = new ListNode(1);

        ListNode resultNode = s.addTwoNumbers(root1,root2);

        while(resultNode!=null){
            System.out.print(resultNode.val);
            resultNode = resultNode.next;
        }

    }
    */
}

本段代码的亮点就是没有引入第三个链表,节省了空间,加上递归进位,使得代码简单易懂。

 

本代码纯个人手写,如有不足之处,还望见谅!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值