标签:node Data7.13 相加 next 链表 l2 l1 null 两数
问题描述
给你两个非空的链表,表示两个非负的整数。她们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字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]
题目分析
- 储存的数字是倒着的,相当于输入234储存为432,所以相加时需要注意这个问题;
- 数字相加大于或者等于10时,向前面进1,所以这个也是需要考虑的问题之一。
- 两个链表值相加后得到的链表,输出时要将链表的按位反输出;
相关知识点
- 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
- 在Java中我们需要自己定义一个链表的类来生成对象,这个类需要由一个存储数据的数据域也需要有存储下一个节点地址的域,因此,我们至少定义两个属性。
代码1
public node addTwoNumbers(node l1, node l2) {
node node1 = l1;
node node2 = l2;
while (node1 != null) //如果node1不为空;
{
if (node2 != null){ //如果node1不为空,node2也不为空;
node1.data += node2.data; //将链表1的数字与链表2的数字相加后赋值给链表1;
node2 = node2.next; //指向链表2 的下一位;
}
if (node1.next == null && node2!=null){ //如果链表1的下一位为空,但链表2不为空,
node1.next = node2; //则直接将链表2的数字赋值给链表1;
}
node1 = node1.next; //进行移动到下一位运行,指向链表1的下一位
}
return node1; //返回链表1,也就是最后输出的是链表1的按位反值;
}
public void marge(node node)
{
while (node != null){ //当链表不为空时,
if (node.data >= 10){ //如果链表的数值有大于等于10的;
node.data = node.data%10; //则进行除以10取余数
if (node.next == null) //大于等于10的数值必须向高一位进一。下面就是该操作;如果大于等于10的哪一位数值的高一位是空的(0);
{
node.next = new node(0); //则将大于等于10的高一位进1;
}
node.next.data +=1; //如果大于等于10的高一位不是为0,则在该数值的基础上加1;
}
}
}
public node addTwoNumbers2(node l1, node l2) {
node pre = new node(0);
node cur = pre;
int carry = 0;
while(l1 != null || l2 != null) { //当链表1和链表2都不为空,
int x = l1 == null ? 0 : l1.data; //判断语句,如果int x = l1 == null,则该表达式等于0;反之则为l1.data;
int y = l2 == null ? 0 : l2.data; //判断语句,如果int y = l2 == null,则该表达式等于0;反之则为l2.data;
int sum = x + y + carry; //将数值保存于int变量内,并把变量相加;
carry = sum / 10; //carry是进数,sum除以10,如果能进1,则取整数;
sum = sum % 10; //sum其余表示个位上的数
cur.next = new node(sum);
cur = cur.next;
if(l1 != null) //判断链表是否为空,不空则赋值给l1,
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
if(carry == 1) {
cur.next = new node(carry);
}
return pre.next;
}
代码2////////////////////////////////////////////////////////////////////////////////////////////////////////
static node head=null;
static node tem = null;
class node {
int data; /*节点数据域*/
node next = null; /*节点指针域*/
public node(int data) {
this.data = data; /*当构造一个新的节点的时候,顺便给节点进行初始化*/
}
}
public void addNode(int d){
node N = new node(d);
if(head==null){ /*如果链表的头结点为空*/
head = N;
return; /*由于每次是增加一个节点,所以对头结点进行初始化之后就要退出函数*/
}
tem = head; /*一般一个链表的头结点是不能动的,因此需要把头结点赋值给一个临时变量
这样在对链表进行访问的时候,就可以用这个临时变量进行逐个的访问,不对头结点产生影响*/
while(tem.next!=null){ //当使用临时变量去对链表进行访问,用临时变量进行逐个的访问,当下一个数据不为空时,
tem = tem.next; //将数据赋值给临时变量;
}
tem.next = N; //将下一个赋值给N;
}
标签:node,Data7.13,相加,next,链表,l2,l1,null,两数 来源: https://www.cnblogs.com/tmtboke/p/15007131.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。