链接:https://leetcode.cn/studyplan/top-interview-150/
20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
Python代码
python
class Solution:
def isValid(self, s: str) -> bool:
stack = []
# 利用栈先进后出的特点,遇见左符号就进栈,遇见右符号则判断栈顶的符号是否与之匹配。
len_s = len(s)
if len_s < 2:
return False
for item in s:
stack_len = len(stack)
if item == "(" or item == "[" or item == "{":
stack.append(item)
if item == ")":
if stack_len != 0 and stack[-1] == "(":
stack.pop()
else:
return False
elif item == "]":
if stack_len != 0 and stack[-1] == "[":
stack.pop()
else:
return False
elif item == "}":
if stack_len != 0 and stack[-1] == "{":
stack.pop()
else:
return False
i += 1
# 操作之后,栈空则全部符合,否则无效
if len(stack) == 0:
return True
else:
return False
if __name__ == '__main__':
s = Solution()
a = "){}"
print(s.isValid(a))
C++代码
cpp
#include <iostream>
#include <stack>
using namespace std;
class Solution {
public:
bool isValid(string s) {
// 创建字符栈
stack<char> myStack;
int len_s = s.size();
if (len_s < 2) return false;
int i;
for (i = 0; i < len_s; i++){
int stack_len = myStack.size(); // 获得栈大小
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
myStack.push(s[i]);
else if (s[i] == ')') {
if (stack_len != 0 && myStack.top() == '(') myStack.pop();
else return false;
}
else if (s[i] == ']') {
if (stack_len != 0 && myStack.top() == '[') myStack.pop();
else return false;
}
else if (s[i] == '}') {
if (stack_len != 0 && myStack.top() == '{') myStack.pop();
else return false;
}
}
return myStack.empty(); // 检查栈是否为空
}
};
int main() {
Solution s;
string a = "())";
cout << s.isValid(a) << endl;
return 0;
}
141. 环形链表
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
提示:
- 链表中节点的数目范围是 [0, 10^4]
- -10^5 <= Node.val <= 10^5
- pos 为 -1 或者链表中的一个 有效索引 。
Python代码
python
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def hasCycle(self, head: ListNode) -> bool:
# 使用快慢指针,快指针每次走两个结点,慢指针每次走一个结点,当快指针遇上慢指针则存在环
fast = head
slow = head
while fast:
if fast.next:
fast = fast.next.next
else:
break
slow = slow.next
if fast == slow:
return True
return False
def CreateListNode(l1):
head = ListNode(l1[0])
node = head
for i in range(1, len(l1)):
new_head = ListNode(l1[i])
node.next = new_head
node = new_head
return head
21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:输入:l1 = [], l2 = [0]
输出:[0]
提示: