leetcode刷题之(逆波兰表达式和链表相交)

题目一:逆波兰表达式
这另个题目在之前牛客网上也有见到过。
逆波兰表达式:又称为后缀表达式,新建一个表达式,如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的元素就是计算结果。
leetcode题目对于是一种简化,只考虑了+,-、*、/ 四则运算,对于优先级等运算没有进行描述。
题目链接

题目分析: 对于逆波兰表达式计算使用一个辅助空间栈进行运算,将所有的数值元素压入栈中,对于符号或操作的元素将栈顶另个元素出栈后,进行相应的运算载压入栈中,所有元素计算完成后,栈中的元素即为表达式的结果。

代码如下:

import java.util.Stack;
class Solution {
    public int evalRPN(String[] tokens) {
    //如果当前的表达式是一个偶数,那么不能构成一个算术运算,直接返回。
        if(tokens.length%2==0)return 0;
        Stack<Integer> stack = new Stack<>(); 
        //依次遍历所有的元素
        for(int i=0;i<tokens.length;i++){
        //当前的元素为+时,将栈中的两个元素弹出并进行+操作
            if(tokens[i].equals("+")){
                if(stack.size()<2){
                    return 0;
                }
                stack.push((stack.pop()+stack.pop()));
            }else if(tokens[i].equals("-")){
             //当前的元素为-时,将栈中的两个元素弹出并进行-操作
                 if(stack.size()<2){
                    return 0;
                }
                Integer a = stack.pop();
                Integer b = stack.pop();
                stack.push(b-a);
            }else if(tokens[i].equals("*")){
                 if(stack.size()<2){
                    return 0;
                }
                stack.push((stack.pop() * stack.pop()));
            }else if(tokens[i].equals("/")){
                 if(stack.size()<2){
                    return 0;
                }
                 Integer a = stack.pop();
                Integer b = stack.pop();
                stack.push((b/a));
            }else{
             //当前的元素为数值类型,直接压入栈中
                stack.push(Integer.valueOf(tokens[i]));
            }
        }
        return stack.pop();
    }
}

题目二:链表相交
链表相交是两个单链表是否有公共的结点,指定两个链表返回结果为两条链表相交的第一个节点。
题目链接

题目分析:
链表问题一般会用到链表指针,两条链表由于结点元素个数的不同,两条链表的长度是不同的,对于长链表指针应该先向后移动一定的位置,然后短指针一起向后移动知道找到第一个相交的结点。
代码如下:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    //只要有一条链表为null就不存在交点
      if(headA == null||headB==null)return null;
      ListNode lA = headA;
      ListNode lB = headB;
      int lenA = 0;
      int lenB = 0;
      //计算链表A的长度
      while(lA!=null){
        lenA++;
        lA=lA.next;         
      }  
      //计算链表B的长度
      while(lB!=null){
        lenB++;
        lB=lB.next;  
      }
      //指针回到起点
       lA = headA;
        lB = headB;
        //长链表先走
     if(lenA>lenB){
         int len = lenA - lenB;
        for(int i = 1;i<=len;i++){
            lA=lA.next;
        }
     }else{
        int len = lenB - lenA;
        for(int i = 1;i<=len;i++){
            lB=lB.next;
        }
     }
     //两个指针一起向后移动
     while(lA!=null&&lB!=null){
        if(lA==lB)return lA;
        lA = lA.next;
        lB = lB.next;
     }
     return null;
    }
}

同样一种思想,有的人就是能够将程序写的优雅:
大神代码:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
      if(headA == null||headB==null)return null;
      ListNode lA = headA;
      ListNode lB = headB;
      while(lA!=null||lB!=null){
          if(lA==lB)return lA;
          lA = lA==null?headB:lA.next;
          lB = lB==null?headA:lB.next;
      }
      return null;
    }
}

注:本人的部分博客放在自己的博客上,由于有的文章需要反复地进行修改与持续学习,相互监督一起进步。
个人博客链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值