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

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

前言

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

一、有效的括号

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

后续

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


相关文章
|
6天前
题目----力扣--回文链表
题目----力扣--回文链表
13 0
|
6天前
题目----力扣--合并两个有序链表
题目----力扣--合并两个有序链表
10 0
|
6天前
题目----力扣--反转链表
题目----力扣--反转链表
15 0
|
6天前
题目----力扣--链表的中间结点
题目----力扣--链表的中间结点
6 0
|
6天前
题目----力扣--移除链表元素
题目----力扣--移除链表元素
13 1
|
7天前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
16 1
|
20天前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
20天前
|
存储
LeetCode刷题---817. 链表组件(哈希表)
LeetCode刷题---817. 链表组件(哈希表)
|
20天前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
20天前
|
算法 安全 数据处理
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)