两数相加
题目链接:
两数相加
题干内容:
- 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
- 请你将两个数相加,并以相同形式返回一个表示和的链表。
- 你可以假设除了数字 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