zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【校招面试 之 C/C++】第23题 C++ STL(五)之Set
    Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
    Redhat Linux安装JDK 1.7
    ORA-10635: Invalid segment or tablespace type
    Symantec Backup Exec 2012 Agent for Linux 卸载
    Symantec Backup Exec 2012 Agent For Linux安装
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    YourSQLDba介绍
    PL/SQL重新编译包无反应
    MS SQL 监控数据/日志文件增长
  • 原文地址:https://www.cnblogs.com/liuhuaabcp/p/14823805.html
Copyright © 2011-2022 走看看