力扣-有效的括号 + 合并两个有序链表 简单 😀

简介: 力扣-有效的括号 + 合并两个有序链表 简单 😀

前言

数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有写出高质量代码的潜意识

一、有效的括号

1.1 问题描述

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。   示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

1.2 思路讲解

本题我们使用栈来模拟括号的匹配,核心思路如下:

  • 创建一个stack 栈用于保存括号和取出括号。
  • 遇到 { [ (等左括号就进栈。
  • 遇到 } ] )等右括号就出栈,出栈的时候判断是否和当前的括号相同。
  • 最后判断stack的长度是否为零,为零表示全部匹配完了,返回true。

1.3 AC代码

var isValid = function (s) {
  const stack = []
    for(let i = 0;i < s.length; i++){
        const cur = s[i]
        switch(cur){
            case '{':
                stack.push('}')
                break;
            case '[':
                stack.push(']')
                break;
            case '(':
                stack.push(')')
                break;
            default:
                if(stack.pop()!=cur){
                    return false
                }
        }
    }
    return stack.length == 0
}

二、合并两个有序链表

2.1 题目描述

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

示例 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 <= 100
  • l1 和 l2 均按 非递减顺序 排列

2.2 思路讲解

题中指出,两个链表都是按照非递减顺序排列的,所以我们的做法也很简单,创建一个新的链表来进行存储,步骤如下:

  • 创建一个新链表的虚拟头节点,使用指针p指向该头节点
  • 只要list1 或者 list2 有值就不断迭代,每次迭代比较两个链表当前节点的值。
  • 值小的插入到新链表当中。 直接看代码吧,比较好理解

2.3 AC代码

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
var mergeTwoLists = function(list1, list2) {
   const dommy = new ListNode(-1)
   let p = dommy
   while(list1 || list2){
       if(list1 && list2){
           if(list1.val < list2.val){
               p.next = list1
               list1 = list1.next
           }else{
               p.next =list2
               list2 = list2.next
           }
       }else if (list1){
           p.next = list1
           list1 = list1.next
       }else {
           p.next = list2
           list2 = list2.next
       }
        p = p.next
   }
   return dommy.next
};

2.5 测试结果

image.png

后续

好了,本篇 力扣-有效的括号 + 合并两个有序链表到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。


相关文章
|
5月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
56 1
|
5月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
76 0
Leetcode第21题(合并两个有序链表)
|
5月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
168 0
|
4月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
5月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
51 0
LeetCode第二十四题(两两交换链表中的节点)
|
5月前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
39 0
Leetcode第二十二题(括号生成)
|
5月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
61 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
5月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
131 0
|
5月前
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
32 0
|
5月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
39 0