LeetCode2-两数相加

简介: LeetCode2-两数相加

题目


给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。


如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。


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

示例


输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807


代码



package com.leetcode.code;
import com.leetcode.source.ListNode;
/** 
* 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 
* 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 
* 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 
* 
* 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 
* 输出:7 -> 0 -> 8 
* 原因:342 + 465 = 807 
*/
public class LeetCode2 {    
  public static ListNode addTwoNumbers(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) ? p.val : 0;            
      int y = (q != null) ? q.val : 0;            
      int sum = x + y + carry;           
      carry = sum / 10;            
      cur.next = new ListNode(sum % 10);            
      cur = cur.next;            
      if (p != null) {               
        p = p.next;            
      }           
      if (q != null) {                
        q = q.next;           
      }       
    }       
    if (carry > 0) {           
      cur.next = new ListNode(carry);       
     }        
     return head.next;    
  }
    public static ListNode buildListNode(int[] list) {  
      ListNode first = null, last = null, newNode;       
      for(int i = 0; i < list.length; i++) { 
        newNode = new ListNode(list[i]);            
        if(first == null) {                
          first = newNode;                
          last = newNode;            
        } else {                
            last.next = newNode;               
            last = newNode;            
          }        
        }        
        return first;   
    }
    private static void commonPrintListNode(ListNode listNode) {
      while(listNode!=null) {          
      String str = listNode.val + "->";        
      if (listNode.next == null) {           
          str = str.substring(0, str.length() - 2);      
         }          
         System.out.print(str);     
         listNode = listNode.next;      
       }   
    }
    public static void main(String[] args) {   
      int[] a = new int[]{2,4,3};     
      int[] b = new int[]{5,6,7};    
      ListNode aList = buildListNode(a);    
      ListNode bList = buildListNode(b); 
      ListNode listNode;
      listNode = aList;   
      commonPrintListNode(listNode);
      System.out.println();   
      listNode = bList;   
      commonPrintListNode(listNode);
      System.out.println();   
      listNode = addTwoNumbers(aList, bList);   
      commonPrintListNode(listNode);  
  }
}


输出结果:



2->4->3

5->6->4

7->0->8


小结



看完这个图,我相信大家都懂了。



这里需要注意一点就是这段代码:


if (carry > 0) {    
  cur.next = new ListNode(carry);
}

需要考虑末尾两个数相加超过10的话,那就当前cur的下一个值就是进位的值。


复杂度分析:

  • 时间复杂度:O(max(m, n)),假设 m 和 n 分别表示 l1 和 l2 的长度,上面的算法最多重复 max(m,n) 次。
  • 空间复杂度:O(max(m, n)),新列表的长度最多为 max(m, n) + 1。
相关文章
|
1月前
|
存储 算法 C++
LeetCode第二题(两数相加)
这篇文章是关于LeetCode上第二题“两数相加”的题解,其中详细描述了如何使用C++语言来实现将两个逆序存储的非负整数链表相加,并返回结果链表的算法。
27 0
LeetCode第二题(两数相加)
|
1月前
|
存储
Leetcode第29题(两数相除)
LeetCode第29题要求使用不包含乘法、除法和mod运算符的方法计算两个整数的商,通过记录结果的正负,将问题转化为负数处理,并利用二进制幂次方的累加来逼近除数,最后根据结果的正负返回相应的商。
15 0
|
3月前
|
算法
LeetCode第2题两数相加
该文章介绍了 LeetCode 第 2 题两数相加的解法,通过同时遍历两个链表的头节点,创建新链表接收计算结果,时间复杂度为 O(n)。
LeetCode第2题两数相加
|
3月前
|
算法
LeetCode第29题两数相除
这篇文章介绍了LeetCode第29题"两数相除"的解题方法,通过使用加法、减法和二进制位移法代替常规的乘除操作,并考虑了整数溢出问题,提供了一种高效的算法解决方案。
LeetCode第29题两数相除
|
3月前
|
JavaScript 前端开发 PHP
leetcode——两数相加【二】
leetcode——两数相加【二】
32 0
|
5月前
LeetCode###445. 两数相加 II
LeetCode###445. 两数相加 II
29 2
|
6月前
|
存储 算法 Go
LeetCode第二题: 两数相加
 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
LeetCode第二题: 两数相加
|
6月前
|
存储
leetcode-2:两数相加
leetcode-2:两数相加
41 0
|
6月前
leetcode-29:两数相除
leetcode-29:两数相除
39 0
|
6月前
|
存储 算法
Leetcode算法系列| 2. 两数相加
Leetcode算法系列| 2. 两数相加