LeetCode - 刷题记录(2)

LeetCode标签“字符串”、列表“Top100”的两道难度简单的题目。

1.有效的括号

题目描述:

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: “()”
输出: true

示例 2:

输入: “()[]{}”
输出: true

示例 3:

输入: “(]”
输出: false

示例 4:

输入: “([)]”
输出: false

示例 5:

输入: “{[]}”
输出: true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses

题解:

1.利用遇到开括号时将其放入栈,遇到闭括号时判断栈是否为空(为空则此前无push进对应的开括号,此字符串非法),

栈不为空则从栈中pop出栈顶元素判断括号类型是否一致,不一致证明此闭括号无对应开括号,字符串非法。

最终栈为空则字符串满足要求,不为空则有不对应的括号存在

class Solution {
    public boolean isValid(String s) {
        if ("".equals(s)) {
            return true;
        }
        Stack<Character> stack = new Stack<Character>();
        for (char c : s.toCharArray()) {
            switch (c){
                case ')':{
                    if (stack.isEmpty() || '(' != stack.pop()) {
                        return false;
                    }
                    break;
                }
                case '}': {
                    if (stack.isEmpty() || '{' != stack.pop()) {
                        return false;
                    }
                }
                break;
                case ']': {
                         if (stack.isEmpty() || '[' != stack.pop()) {
                        return false;
                    }
                    break;
                }
                default:{
                    stack.push (c);
                }
            }
        }
        return stack.isEmpty();
    }
}

2.简洁代码,同样利用栈,遇到开括号时直接在栈中存入对应的闭括号遇到闭括号则直接判断和栈顶元素是否相同即可。

最终栈为空则字符串满足要求,不为空则有不对应的括号存在

class Solution {
    public boolean isValid(String s) {
        Stack<Character>stack = new Stack<Character>();
        for(char c: s.toCharArray()){
            if(c=='(') { stack.push(')') };
            else if(c=='[') { stack.push(']') };
            else if(c=='{') { stack.push('}') };
            else if(stack.isEmpty()||c!=stack.pop()) { return false };
        }
        return stack.isEmpty();
    }
}

在这里插入图片描述

2. 合并两个有序链表

题目描述:

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

题解:
1.创建一条新链表,一个一个对比两链表元素的大小,满足条件的元素放入新链表。(注意需要一个引用始终引用着新链表的头部,避免在合并过程中,头部引用丢失)


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            ListNode newListNode = new ListNode();
            // 新链表头的引用。合并过程中,newListNode引用会修改,header引用用于最后的返回。
            ListNode header = newListNode;
            // 两链表不为空时,比较元素大小,小的连接在新链表后,引用后移。
            while (l1 != null && l2 != null) {
                    if (l1.val <= l2.val) {
                        newListNode.next = l1;
                        l1 = l1.next;
                    } else {
                        newListNode.next = l2;
                        l2 = l2.next;
                        }
                    // 引用始终引用新链表的最后一个元素
                    newListNode = newListNode.next;
            }
               // 其中一条链表为空,则将另一条链表剩余元素连接在新链表后
                if (l1 == null) {
                    newListNode.next = l2;
                } 
                if (l2 == null) {
                    newListNode.next = l1;
                }
                    return header.next;
        }
}

在这里插入图片描述
有些地方表达的意思可能不是很准确还有可能存在错误,有问题请提出,感谢❤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值