不积跬步无以至千里—day2

Posted 你这家伙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不积跬步无以至千里—day2相关的知识,希望对你有一定的参考价值。

两数相加(链表相加)

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

解题思路:

  1. 首席按定义一个新链表的虚拟头节点,在定义一个cur每次指向新链表的尾节点,在定义一个carry表示进位
  2. 其次遍历 l1 和 l2 ,每次拿到 l1 和 l2 的值,因为存在一个链表长一个链表短的情况,所以当遇到链表走到空的时候,就让他的值为0
  3. 让第二步得到的两个值相加再加上进位数(这里可能有的人会想着去整一个判断,去判断当前获取的值是否大于10,但是没有必要,因为对9取余它就是9,存储的也是9,对18取余它也是8,那么就不用加上判断,同样carry也是如此)
  4. 然后然carry取商(因为1-20以内任何数对10取商要么是0要么是1),然后new一个新的节点保存count%10的值,之后改变链表的指向
  5. 可以观察到上面示例三,当最后两个数加起来大于10的话,还会new一个新的节点来存放1(注意,这里也只能是1,因为这个节点的来源就是前面两数相加大于10,那么之后向后进1,那么就不会有这个节点)

代码

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //定义一个虚拟头节点
        ListNode dummyHead  = new ListNode();
        //定义一个cur指向当前新链表的尾节点
        ListNode cur = dummyHead;
        //定义一个carry来保存进位的值
        int carry = 0;
        while (l1 != null || l2 != null){
            //分别获取到了l1和l2的值
            int num1 = l1 == null ? 0 : l1.val;
            int num2 = l2 == null ? 0 : l2.val;
            //此时定义一个count记录num1+num2的值
            int count = num1+num2+carry;
            //然后进位也发生了变化,如果他是大于10的那么就让他为1,如果是小于10的,那么就让他为0,也就是对carry取商
            carry = count / 10;
            //此时new一个新的节点来存放count,但是存放的count是一个小于10的,也就是count%10
            count = count % 10;
             ListNode node = new ListNode(count);
            //然后改变新链表的指向
            cur.next = node;
            cur = cur.next;
            if(l1 != null)l1 = l1.next;
            if(l2 != null)l2 = l2.next;
        }
        //当这个链表走完之后,如果carry还是等于1的话,那么就需要在new一个节点来存放1
        if(carry == 1){
            ListNode node = new ListNode(carry);
            cur.next = node;
            cur = cur.next;
        }
        return dummyHead.next;
    }

用两个栈实现队列

![在这里插入图片描述](https://img-blog.csdnimg.cn/0cd3f9e9481f427fb57d724445d0823c.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQzMTY1,size_16,color_FFFFFF,t_70) 思路分析:
  1. 入队:如果两个栈都是空的,第一次,那么我们规定入到S1,每次都放到S1
  2. 出队:从S2当中出,如果S2是空的,那么把S1当中的元素全部导入S2当中
  3. 如果S2不是空的,那么直接将S2的栈顶元素进行pop();
    代码:
public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        //不管stack1是否有数据,没每次都将数据存放在stack1里面
        stack1.push(node);
    }
    
    public int pop() {
        //定义一个值来存放队顶元素
        int topValue = 0;
    //每次弹出队顶元素都从stack2中弹出
        //如果stack2中有元素,那么直接将栈顶的元素弹出,
        //如果没有,那么就将stack1中的所有元素都放到stack2中,然后弹出stack2的栈顶元素就是队顶元素
        if(stack2.isEmpty()){
       while(!stack1.isEmpty()){    
           stack2.push(stack1.pop());
       }
        }
                if(!stack2.isEmpty()){
            topValue = stack2.pop();
        }
        return topValue;
    }
}

以上是关于不积跬步无以至千里—day2的主要内容,如果未能解决你的问题,请参考以下文章

不积跬步无以至千里

不积跬步无以至千里,不积小流无以成江海

不积跬步无以至千里——LeetCode 22.括号生成

技术成长-不积跬步无以至千里

不积跬步无以至千里——LeetCode_771

不积跬步无以至千里,我与CSDN不平凡的2021年