这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战
有效的括号
Hot100 20.有效的括号
难度:简单
给定一个只包括(,),{,},[,]的字符串s,判断字符串是否有效。
有效字符串需满足:
- 左括号必须使用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例1:
输入:s = "()"
输出:true
示例2:
输入:s = "()[]{}"
输出:true
示例3:
输入:s = "(]"
输出:false
示例4:
输入:s = "([)]"
输出:false
示例5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
题解
使用栈
可以使用栈来判断括号的有效性。
遍历字符串s,当遇到一个左括号时,我们希望有一个相同类型的右括号将其闭合,并且左括号必须以正确的顺序闭合。
可以看到先出现的左括号后匹配,因此可以使用模式识别,采用先进后出的处理顺序,可以用栈来处理。
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const n = s.length;
// 若字符串长度为奇数,则字符串一定无效,返回False
if(n % 2) return false;
const maps = new Map([
[')','('],
[']','['],
['}','{']
]);
// 使用栈来模式匹配括号
const stack = [];
// 循环遍历字符串
for(let x of s){
//
if(maps.has(x)){
if(stack[stack.length - 1] !== maps.get(x)) return false;
else stack.pop();
}else{
stack.push(x)
}
}
return !stack.length;
};
时间复杂度:O(n)
空间复杂度:O(n)
合并两个有序链表
Hot100 21.合并两个有序链表
难度:简单
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例2:
输入:l1 = [], l2 = []
输出:[]
示例3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50] -100 <= Node.val <= 100l1和l2均按 非递减顺序 排列
题解
法一 递归
使用递归的方式判断大小排序并进行合并,需考虑边界情况。
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
if(!l1){
return l2;
}else if(!l2){
return l1;
}else if(l1.val < l2.val){
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
};
时间复杂度:O(m+n)
空间复杂度:O(m+n)
法二 迭代
当l1和l2都不是空链表时,判断l1和l2哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。
设定一个哨兵节点prehead,用于后续返回合并后的链表,同时维护一个prev指针,不断调整它的next指针。
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function(list1, list2) {
const prehead = new ListNode(0,null);
let prev = prehead;
while(list1 && list2) {
if(list1.val <= list2.val) {
prev.next = list1;
list1 = list1.next;
}else{
prev.next = list2;
list2 = list2.next;
}
prev = prev.next;
}
prev.next = list1 !== null ? list1 : list2;
return prehead.next;
};
时间复杂度:O(m+n)
空间复杂度:O(1)
坚持每日一练!前端小萌新一枚,希望能点个赞+在看哇~