leetCode2:两数相加

  • 题目:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
  • 个人解法:

我是自己先写的代码,写的比较麻烦,搞得我总结都不好总结。

       先定义两个标签tag1,tag2用来判断两个链表是否为空,定义tmp链表作为两个链表每位数加减的存储,定义flag用来存储每位是否有进位。

       while循环判断两个链表是否为空,进入后将非空的链表同上次进位相加,然后再判断本次进位。总之特别多if else。

 public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 要点:进位
        ListNode res = new ListNode(0);
        boolean flag = false,tag1 = true,tag2 = true; // tag判断下个节点是否为null,flag判断是否进位
        ListNode tmp = res;
        while(tag1 || tag2){
            int value;
            if (tag1&&!tag2){// 一个一个情况判断比较麻烦
                value = tmp.val+l1.val;
                l1 = l1.next;
            }else  if (tag2&&!tag1){
                value = tmp.val+l2.val;
                l2 = l2.next;
            }else {
                value = tmp.val+l1.val+l2.val;
                l1 = l1.next;
                l2 = l2.next;
            }
            if (value>=10){// 判断进位与当前值
                value = value -10;
                flag = true;
            }
            tmp.val = value;


            if (l1 ==null){
                tag1 =false;
            }
            if (l2 == null){
                tag2 = false;
            }

            if(flag){// 给下个节点设置val,进位直接设置进去
                tmp.next = new ListNode(1);
                flag = false;
            }else if (tag1 || tag2){
                tmp.next = new ListNode(0);
            }
            tmp = tmp.next;
        }

        return res;
    }

然后就是官方给的,相比于我的,减少了很多判断,定义cur作为最后一个链表,使用余数,除数比较简单,判断为空加0.

public static ListNode addTwoNumbers1(ListNode l1, ListNode l2) {
        // 要点:进位
       ListNode head = new ListNode(0);// 第一个节点无意义,从第二个节点开始
       ListNode p = l1,q = l2,cur = head;
       int carry = 0;
       while(p != null || q != null){
          int x = (p==null)?0:p.val; // 不需要同我那样判断非空 ,空直接加0
          int y = (q==null)?0:q.val;
           int sum = carry+x+y;
           cur.next = new ListNode(sum%10);// 当前和定义为下个节点
           cur = cur.next;
           carry = sum/10;
           if (p != null){
               p = p.next;
           }
           if (q!=null){
               q = q.next;
           }
       }
       if (carry>0){
           cur.next = new ListNode(carry);
       }

       return head.next;
    }

 自己写的那个方法时间复杂度同官方相同,不过代码复杂度比较高。

你可能感兴趣的:(leetcode,java)