给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3],l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
从左到右依次相加 进位即向右加1
2+5 =7
4+6 =0 向右进位 1
3+4+1=8
输出结果为 7 0 8
先进来的数的数先进行相加,相加后大于10>进位取余数
(注意有点 如果 l1[1,2,3] , l2 [1,2] 应该先将 l2赋值为[0 , 1,2] 因为从进位来看 右边的数为高位
这样就可以理解 赋值为什么从左边赋值) 代码如下:
给你两个 非空 的链表-----链表
链表是由俩部分构成 [date][pre] 数据域和指针域构成
[date] 数据域 :存放数据元素
[pre] 指针域 :存放下一个元素的地址
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
由注释可以知道
链表是 数据类型int,指针next 构成的[val][next]链表
当存放数据时调用方法LisNode(val)
cur.next = new ListNode(charr);
数据存放结束后,指针指向下一个元素
如 : next = next.next; 指针等于下一个的元素的地址
cur = cur.next;
看一下给出的数据
public ListNode addTwoNumbers(ListNode l1, ListNode l2)
我们可以得到 链表l1 和 链表l2
需要我们返回 ListNode (一个链表)
1、创建链表,定义指针 per指向头节点(首地址) 定义cur 移动指针位置
ListNode per = new ListNode(0);
ListNode cur = per;
2、将俩个指针的数据相加 ,链表有俩个范围不好控制所以 使用while
要将俩个数据相加 , 判读链表是否为空 ,为空将要赋值0
既然考虑到要赋值 定义int型变量 如:x1
为空赋值0 不空赋值 val
while(l1!=null||l2!=null){
int x1 = l1 == null ? 0 : l1.val;
int x2 = l2 == null ? 0 : l2.val;
int sum = x1 + x2;
}
3、将sum存入 链表 存入的值 sum 应该 0<=sum<10;
因此需要一个数 控制进位
while(l1!=null||l2!=null){
int charr = 0;
int x1 = l1 == null ? 0 : l1.val;
int x2 = l2 == null ? 0 : l2.val;
int sum = x1 + x2 + charr;
charr = sum / 10;
sum = sum % 10;
cur.next = new ListNode(sum);
}
4、移动指针
while(l1!=null||l2!=null){
int charr = 0;
int x1 = l1 == null ? 0 : l1.val;
int x2 = l2 == null ? 0 : l2.val;
int sum = x1 + x2 + charr;
charr = sum / 10;
sum = sum % 10;
cur.next = new ListNode(sum);
cur = cur.next;
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
如果最后一位的sum >9 需要进位 但是charr 在while 那就无法进位,l1和l2都空了
charr需要在while外面,如果最后charr = 1 我们移动到下一个指针 赋值1;
int charr = 0;
while(l1!=null||l2!=null){
int x1 = l1 == null ? 0 : l1.val;
int x2 = l2 == null ? 0 : l2.val;
int sum = x1 + x2 + charr;
charr = sum / 10;
sum = sum % 10;
cur.next = new ListNode(sum);
cur = cur.next;
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
if(charr == 1){
cur.next = new ListNode(charr);
}
完整代码如下
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode per = new ListNode(0);
ListNode cur = per;
int charr=0;
while(l1!=null||l2!=null){
int x1 = l1 == null ? 0 : l1.val;
int x2 = l2 == null ? 0 : l2.val;
int sum = x1 + x2 + charr;
charr = sum / 10;
sum = sum % 10;
cur.next = new ListNode(sum);
cur = cur.next;
if(l1 != null)
l1=l1.next;
if(l2 != null)
l2 = l2.next;
}
if(charr == 1){
cur.next = new ListNode(charr);
}
return per.next;
}
}