给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。
Posted 小型骷髅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。相关的知识,希望对你有一定的参考价值。
力扣原题:两数相加。
先贴代码:
public ListNode addTwoNumbers(ListNode l1, ListNode l2)
ListNode l3 = new ListNode(-1); //定义一个新链表的头节点l3
ListNode node3 = l3; //定义头节点的副本node3
int ex = 0; //定义一个进位值ex
while (l1 != null || l2 != null)
ListNode nodeNext = new ListNode(-1); //定义node的后继节点
node3.next = nodeNext;
//将l1的val赋值给a
int a = 0;
if (l1 != null)
a = l1.val;
//将l2的val赋值给b
int b = 0;
if (l2 != null)
b = l2.val;
//将a和b的和赋值给c再加上进位值ex即为放入新链表的和
int c = a + b + ex;
//进行判断;若c >= 10 则产生进位值
if (c >= 10)
c = c - 10;
nodeNext.val = c;
ex = 1;
else
nodeNext.val = c;
ex = 0;
//以下各节点往后走一步
node3 = node3.next;
if (l1 != null)
l1 = l1.next;
if (l2 != null)
l2 = l2.next;
//若循环走完仍然有进位值,则说明最后一位值位10,所以再新建一个尾巴节点值位1
if (ex == 1)
ListNode cur = new ListNode(1);
node3.next = cur;
//返回头节点的next域
return l3.next;
解题思路:
在本题题目中给了我们两条链表,分别表示两个非负的整数,每位数字都是按照逆序的方式存储的。说明一条链表表示的整数正确读法应该是反过来读;例如链表:2->3->4 ,那它表示的数字应该为432。所以每一个链表第一个节点都代表着个位数。即在两数相加过程中,进位值都会进入next域,由此我便想到了,先创建一个新的链表,新链表每个节点都来储存其两条链表各节点相加的值:
然后就可以设定循环,要求链表1和链表2都走完时循环结束:
进入循环后新建一个节点来存储链表1和链表2节点的和:
再将链表1和链表2的节点值相加:
注意:进入循环前已经设定了进位值ex为0,代表开始时没有进位。
对节点和c进行判断,若其大于等于10说明产生了进位值,将ex赋为1,传入下一次循环中。
之后将各节点往后走一步:
注意:为了避免空指针异常,链表1和链表2在遍历时需要判断其是否为null,若是则不能将其指向next域。
等待循环走完后若此时进位值ex为0,说明原先两条链表最后一个节点相加值小于10,就不需要进位了;若ex值位1,说明已经产生进位,还需要再新建一个节点,其值为1,接到新链表的后面。此时就会有疑问:为什么新建节点val值为1?
在原题目中提示了Node.val值域是0到9,所以两节点之和最大也只是18,即若有进位值的话,它的值有且仅有1,所以新建节点值位1。
PS:此题解仅为个人解法,可能并非最优解法,若有错误及疑问欢迎指出。
以上是关于给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。的主要内容,如果未能解决你的问题,请参考以下文章
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。