这次讲解的题目是LeetCode上的第T445两数相加 II(中等),其T2两数相加(中等)可参考:https://blog.csdn.net/Pzzzz_wwy/article/details/105519719
接下来上题:
节点的定义:
话不多说上思路:
首先我们得知道我们如果通过遍历,那么最先得到的就是较高位的值,然后再依次得到较低的值,然后按位置再相加后将值写到一个新的链表,接下来讲解具体步骤:
首先,我们用栈来存储依次从两个链表得到的值,为什么呢,因为我们先提取到的较高位的数,然后压栈,故栈顶就是低位的数,那样我们出栈就是较低位的数,正好从低位进行相加,符合两数相加的规则!如图:
这样我们就能得到最低的两位的数了,然后创建一个新的Node,然后依次放入链表。
那怎么放入链表呢,要知道,我们先得到的值是低位的数,而我们如果直接插入到链表中的话,链表位的数就是最高位的数,所以,我们选择头插法来对链表进行插入,如图:
我们用如上方式对链表操作,这样能保证得到的值直接加入到链表,同时直接返回规定的链表(链表头为最高位)。
接下来上代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//定义两个栈来进行存储链表
Stack<Integer> st1=new Stack();
Stack<Integer> st2=new Stack();
//将两个链表的值压栈
while(l1!=null){
st1.push(l1.val);
l1=l1.next;
}
while(l2!=null){
st2.push(l2.val);
l2=l2.next;
}
//定义链表
ListNode head=null;
//存储每次相同位相加时候需要的进位
int cur=0;
while(!st1.empty()||!st2.empty()||cur>0){ //只要任意一个栈中还有数,或者加完后cur为1(此时为最高位相加后进位但是栈空的情况!)
int s1=st1.empty()?0:st1.pop();//如果其中一个栈空了但是取值则会是null,报异常,所以置为0
int s2=st2.empty()?0:st2.pop();
int sum=(s1+s2+cur)%10;
cur=(s1+s2+cur)/10;
//利用头插法,新的节点的next指向链表,再将head指向对node的引用
ListNode node=new ListNode(sum);
node.next=head;
head=node;
}
return head;
}
}
需有几点需要注意:
1.如果两个栈的元素之不以一样,当一个还有,另外一个为空的时候相加必然会取的值为null,报错,所以我们需要加上判断,如果栈空,那么当前的值就不能是null了,而是0。
2.如果相加到最后最高位产生了进位的情况,那么我们只需要在循环条件上加上cur>0的情况,因为这是因为上一次循环cur=(s1+s2+cur)/10为大于0,其实也就是1,所以产生了进位。
以上就是本次题解,利用栈来保存链表里面的值,再在同位相加的时候利用头插法插入链表!如果有讲的不好的地方或者疑惑欢迎在下方留言!谢谢!