当前位置: 代码迷 >> 综合 >> 【Leedcode】经典习题分析(2)
  详细解决方案

【Leedcode】经典习题分析(2)

热度:14   发布时间:2024-02-12 16:23:48.0

本篇难度:简答

习题一:有效的括号

题目:

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

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 注意空字符串可被认为是有效字符串。

示例:

输入: "{[]}"

输出: true

解题思路:

本题用到了数据结构中栈的思想,规则很简单。创建一个栈stack存储左括号,碰到右括号时候,弹出stack的顶端元素看看是否与该右括号匹配。

class Solution:def isValid(self, s: str) -> bool:dic = {'{': '}',  '[': ']', '(': ')', '?': '?'}# 为了防止第一个就是右括号,此时stack为空,造成stack.append(c)出错stack = ['?']for c in s:if c in dic: # 添加左括号stack.append(c)elif dic[stack.pop()] != c: # 弹出的元素与右括号不匹配return False# 长度为1是值最后所有括号都匹配,只剩'?'元素在栈中return len(stack) == 1

习题二:合并两个有序链表

题目:

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

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解题思路:

调用递归,我们判断 l1 和 l2 头结点哪个更小,然后较小结点的 next 指针指向其余结点的合并结果。终止条件:当两个链表都为空时,表示我们对链表已合并完成。
因为这就是一个不断找新的链表中,最小头结点的问题,反复用一个方法,因此用递归最简单。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:if not l1: return l2  # 终止条件,直到两个链表都空if not l2: return l1if l1.val <= l2.val:  # 递归调用l1.next = self.mergeTwoLists(l1.next,l2)return l1else:l2.next = self.mergeTwoLists(l1,l2.next)return l2