LeetCode之两数相加(链表逆序相加)超详细java讲解

描述:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。         

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
输入:l1 = [0], l2 = [0]
输出:[0]

思路一:用链表l1和链表l2从前往后相加,但是相加后满十进一是进到后面,因为题目要求是返回一个逆序的和,这是我们平时两个整数正常相加的唯一区别。

时间复杂度:O(max(m,n)),m,n分别是两个链表的长度。

空间复杂度:O(1)

结点类:

class ListNode {
      int val;
      ListNode next;
      ListNode(int val) { 
          this.val = val;
      }
}

完整代码如下:

 public ListNode addTwoNumbers(ListNode l1,ListNode l2){

        ListNode head = null,tail = null;//创建新的头结点和尾结点
        int carry = 0;
        while(l1 != null || l2 != null){
            int n1 = (l1 != null ? l1.val:0); //结点不为null的话就赋值当前结点的值,否则赋值为零
            int n2 = (l2 != null ? l2.val:0);
            int sum  = n1 + n2 + carry;  //从前往后取值相加,carry最初是n1+n2相加的十位上的值
            if(head == null){
                head = tail = new ListNode(sum%10); //开始head为空,head=tail,并赋值sum%10

            }else{
                tail.next = new ListNode(sum%10); //head不为空,则直接赋值sum%10
                tail = tail.next;   //后移一位
            }
            carry = sum/10;  //carry即十位上的值,进制
            if(l1 != null){   //如果l1不为null则直接后移一位
                l1 = l1.next;
            }
            if(l2 != null){
                l2 = l2.next;
            }
        }
        if(carry>0){           //最后一个进制放最后,千万别忘了。
            tail.next = new ListNode(carry);
        }
        return head;
    }

注意点:据说将carry = sum/10; 改成carry = sum > 9 ? 1:0可以更加省时。理由是除法运算比直接比较跟费时,具体没验证。2021-05-28

原文地址:https://www.cnblogs.com/liuhuaabcp/p/14823805.html