“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
20. 有效的括号
一、题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
二、思路分析:
准备一个栈,遇到左括号时入栈, 当遇到右括号时, 弹出栈顶元素,查看是否匹配, 不匹配时直接返回 False, 匹配就继续循环, 最后 栈为空时返回 true 反之 false
三、AC 代码:
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
Map<Character, Character> map = new HashMap<>();
map.put(')','(');
map.put(']','[');
map.put('}', '{');
char[] ch = s.toCharArray();
for(char c : ch){
if(map.containsKey(c)){
if(stack.isEmpty()) return false;
char pop = stack.pop();
if(pop != map.get(c)) return false;
}else{
stack.push(c);
}
}
return stack.isEmpty();
}
}
21. 合并两个有序链表
一、题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
二、思路分析:
遍历两个有序链表, 当链表不为空时, 将较小元素的节点接在答案的后面, 循环处理即可
三、AC 代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode ans = new ListNode(-1);
ListNode cur = ans;
int INF = 1000;
while(list1 != null || list2!=null){
int a = list1!=null ? list1.val : INF;
int b = list2!= null ? list2.val : INF;
if(a < b){
cur.next = new ListNode(a);
list1 = list1.next;
}else{
cur.next = new ListNode(b);
list2 = list2.next;
}
cur = cur.next;
}
return ans.next;
}
}