LeetCode0002-链表相加

//给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
//
//请你将两个数相加,并以相同形式返回一个表示和的链表。
//
//你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
//
//来源:力扣(LeetCode)
//链接:https://leetcode-cn.com/problems/add-two-numbers

package codepackage;

//重点在:新建一个链表时,要用一个指针来固定表示新链表的头地址,用第二个指针来进行链表的延长
//重点二:对链表为空时的判断,如果 while循环里的条件为 A!=NULL || B!==NULL,则内部需要对单独为空的情况做单独处理,避免空指针
//重点三:最后一位有进位时,需要单独处理!否则就少一位
public class Num002_addTwoNumbers {
    public static  ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            int carry =0;

            ListNode sum = new ListNode();
//            第一个指针固定链表头部,避免头部地址消失
            ListNode result=sum;
            while(l1 != null || l2!=null){

                ListNode two = new ListNode();
                if(l1 == null){
                    two.val=(l2.val+carry)%10;
                    carry = (l2.val+carry)/10;

                }else if(l2==null){
                    two.val=(l1.val+carry)%10;
                    carry = (l1.val+carry)/10;
                }else{
                    two.val = (l1.val+l2.val+carry)%10;
                    carry=(l1.val+l2.val+carry)/10;}
                sum.next=two;
//                第二个指针用于延长链表
                sum = sum.next;
                if(l1!=null)l1=l1.next;
                if(l2!=null)l2=l2.next;

            }
            if(carry >0){
                ListNode two1 = new ListNode();
                two1.val=1;
                sum.next=two1;
            }
            return result.next;


        }

//        优化非空的写法,减少代码量
    public static  ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
        int carry =0;

        ListNode sum = new ListNode();

        ListNode result=sum;
        while(l1 != null || l2!=null){

            ListNode two = new ListNode();
//            // 优化判断,如果l1==null时,这样依然不可以,还是会报错空指针
//            l1.val = l1==null? 0:l1.val;
//            l2.val = l2 == null? 0:l2.val;
//            这样就是最好了
            int x = l1==null? 0:l1.val;
            int y = l2 == null? 0:l2.val;

            two.val = (x+y+carry)%10;
            carry=(x+y+carry)/10;
            sum.next=two;
//                第二个指针用于延长链表
            sum = sum.next;
            if(l1!=null)l1=l1.next;
            if(l2!=null)l2=l2.next;

        }
        if(carry >0){
            ListNode two1 = new ListNode();
            two1.val=1;
            sum.next=two1;
        }
        return result.next;


    }


    public static void main(String[] args) {
        ListNode l1=new ListNode(2);
        l1.next = new ListNode(4);
        l1.next.next = new ListNode(3);

        ListNode l2=new ListNode(5);
        l2.next = new ListNode(6);
        l2.next.next = new ListNode(4);

        ListNode result = addTwoNumbers(l1,l2);
        System.out.println(result);

        System.out.println(10%10);


    }


}

 

posted on 2021-06-29 22:31  cStream  阅读(51)  评论(0)    收藏  举报