CONTENTS
- LeetCode 21. 合并两个有序链表(简单)
- LeetCode 22. 括号生成(中等)
LeetCode 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
≤
N
o
d
e
.
v
a
l
≤
100
-100\le Node.val\le 100
−100≤Node.val≤100
l1
和 l2
均按非递减顺序排列
【分析】
直接模拟即可,每次取两个链表中较小的结点,接到新链表的后面,如果其中一个链表空了,则直接将另一个链表接到新链表的后面。
【代码】
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
auto dummy = new ListNode(-1), cur = dummy; // 用auto才能并排写
while (list1 && list2)
if (list1->val < list2->val) cur = cur->next = list1, list1 = list1->next;
else cur = cur->next = list2, list2 = list2->next;
if (list1) cur->next = list1;
else if (list2) cur->next = list2;
return dummy->next;
}
};
LeetCode 22. 括号生成(中等)
【题目描述】
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
【示例1】
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
【示例2】
输入:n = 1
输出:["()"]
【提示】
1 ≤ n ≤ 8 1\le n\le 8 1≤n≤8
【分析】
本题只有小括号,对于这类问题,判断一个括号序列是否合法有一些很重要的推论:
- 任意前缀中,
(
数量一定大于等于)
数量(最重要); (
和)
的数量相等。
我们可以使用 DFS 搜索方案,对于每个位置,只要当前 (
的数量小于
n
n
n 就可以填入,而填入 )
需要满足当前 )
的数量小于
n
n
n 且小于 (
的数量。
【代码】
class Solution {
public:
vector<string> res;
vector<string> generateParenthesis(int n) {
dfs(n, 0, 0, "");
return res;
}
void dfs(int n, int lc, int rc, string now) // lc和rc分别表示左右括号的数量
{
if (lc == n && rc == n) { res.push_back(now); return; }
if (lc < n) dfs(n, lc + 1, rc, now + '(');
if (rc < n && rc < lc) dfs(n, lc, rc + 1, now + ')');
}
};