不积跬步无以至千里—day2
Posted 你这家伙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不积跬步无以至千里—day2相关的知识,希望对你有一定的参考价值。
两数相加(链表相加)
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路:
- 首席按定义一个新链表的虚拟头节点,在定义一个cur每次指向新链表的尾节点,在定义一个carry表示进位
- 其次遍历 l1 和 l2 ,每次拿到 l1 和 l2 的值,因为存在一个链表长一个链表短的情况,所以当遇到链表走到空的时候,就让他的值为0
- 让第二步得到的两个值相加再加上进位数(这里可能有的人会想着去整一个判断,去判断当前获取的值是否大于10,但是没有必要,因为对9取余它就是9,存储的也是9,对18取余它也是8,那么就不用加上判断,同样carry也是如此)
- 然后然carry取商(因为1-20以内任何数对10取商要么是0要么是1),然后new一个新的节点保存count%10的值,之后改变链表的指向
- 可以观察到上面示例三,当最后两个数加起来大于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) 思路分析:- 入队:如果两个栈都是空的,第一次,那么我们规定入到S1,每次都放到S1
- 出队:从S2当中出,如果S2是空的,那么把S1当中的元素全部导入S2当中
- 如果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的主要内容,如果未能解决你的问题,请参考以下文章