leetcode 22,括号生成 (dfs) 21 合并链表

22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,
用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]

题解:采用暴力解法,直接生成所有结果的结构树(其实为满二叉树),dfs遍历所有节点

# 生成所有情况
class Solution:
    def generateParenthesis(self, n: int) :
        if n <= 0: return []
        res = []
        def dfs(paths):
            if len(paths) == n * 2:  # 因为括号都是成对出现的
                res.append(paths)
                return

            dfs(paths + '(')
            dfs(paths + ')')

        dfs('')
        return res
输出的结果如下 ['((((', '((()', '(()(', '(())', '()((', 
'()()', '())(', '()))', ')(((', ')(()', ')()(', ')())', 
'))((', '))()', ')))(', '))))'] 
我们发现有一些结果是我们不需要的,比如((((,比如)))) 观察不需要的括号特点,
((((实际上已经超过n了,我们生成同一方向的括号只需要n个即可,
在生成的时候我们要限制住左括号与右括号生成的数量
这时我增加了left与right参数,分别代表左括号与右括号的数量,
每生成一个我就增加一个。
那结束DFS的条件首先就需要把不符合的给过滤掉, ( > n 或 ) > n 或 ) > (
当然 ) > n 这个条件也可以没有,因为 ) > ( 条件已经给控制住了。
# dfs 解法
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        if n <= 0: return []
        res = []

        def dfs(paths, left, right):
            if left > n or right > left: return
            if len(paths) == n * 2:  # 因为括号都是成对出现的
                res.append(paths)
                return

            dfs(paths + '(', left + 1, right)  # 生成一个就加一个
            dfs(paths + ')', left, right + 1)

        dfs('', 0, 0)
        return res

21 合并有序链表

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

题解:创建一个新的链表add,并使用dummy节点来保存新链表的头节点。 在while循环中,代码会比较list1和list2的当前节点的值, 将较小的节点添加到新链表的末尾,并将对应的链表向前移动一位。 然后,add节点也向前移动一位,以便于添加下一个节点。 当list1或list2其中一个链表遍历完后,while循环就会结束。 此时,另一个链表可能还有剩余的节点,这些节点都比新链表的所有节点的值要大, 所以可以直接将它们添加到新链表的末尾。 最后,代码返回dummy.next,即新链表的头节点。注意,dummy节点本身是一个哑节点, 不包含在最终的链表中。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def mergeTwoLists(self, list1, list2):
        """
        :type list1: Optional[ListNode]
        :type list2: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        add=dummy=ListNode(0)

        while  list1 and list2:
            # 选择较小的,(升序输出)
            if list1.val<list2.val:
                add.next=list1
                list1=list1.next
            else:
                add.next=list2
                list2=list2.next
            add=add.next
        add.next=list1 or list2
        return dummy.next

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

01_

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值