LeetCode刷题之T445两数相加 II(中等)

这次讲解的题目是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,所以产生了进位。
在这里插入图片描述
以上就是本次题解,利用栈来保存链表里面的值,再在同位相加的时候利用头插法插入链表!如果有讲的不好的地方或者疑惑欢迎在下方留言!谢谢!

猜你喜欢

转载自blog.csdn.net/Pzzzz_wwy/article/details/105623573