算法练习:两数相加(中等难度)

两数相加

题目链接:

​ 两数相加

题干内容:

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

示例一:

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

示例二:

输入:l1 = [0], l2 = [0]
输出:[0]

示例三:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

  • 每个链表中的节点数在范围 [1, 100]
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

解法:

个人理解:主要是对题干要理解清楚吧,题干中的链表节点有第一个节点逐个往后:个位、十位、百位、千位…

也就是说,所谓的两数相加,就是每个链表对应的节点进行相加。

  • l1 = [2,4,3]
  • l2 = [5,6,4]
  • 初步结果:[2+5 , 4+6 , 3+4]

由于题干限制了每个数的大小为[0,9],且链表最后一个节点不为0,所以考虑到进位carry,那么相加的数最大不超过9+9 = 18,由于可能进位一个1,所以两对应节点相加,再加上进位的1,此时最大数为9+9+1=19,终上所述,无论怎么相加,最大进位carry只能为1。

  • 考虑到进位之后:[ 2 + 5 + 0 , (4+6)/10 + 0 , 3+4+1 ] = [ 7 , 0 , 8 ]

对两链表进行遍历相加即可,考虑到进位可知遍历条件: ( l1 != null || l2 != null || carry == 1 ) 。

package com.test;

//节点类
public class ListNode {
   
    public int val;
    ListNode next;

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

    //相加方法
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
   
        int carry = 0;  //进位符
        ListNode list = new ListNode(0);
        ListNode node 

你可能感兴趣的:(算法练习,java)