24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
**输入:**head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
**输入:**head = []
输出:[]
示例 3:
**输入:**head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
对于两个结点交换我们需要其前置结点
所以可以创建一个虚拟头节点
然后每交换一次更新一次前置节点指针
直到剩余结点不够交换的(pre->next或pre->next->next为空)
1234567891011121314151617class Solution {public:ListNode* swapPairs(ListNode* head) {ListNode* pre = new ListNode(-1, head);ListNode* ans = pre;while (pre != nullptr ...
23. 合并 K 个升序链表
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
**输入:**lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
**解释:**链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2:
**输入:**lists = []
输出:[]
示例 3:
**输入:**lists = [[]]
输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4
使用最小堆
每个链表头节点入堆,每次取出堆顶,如果堆顶节点有后续节点则后续节点继续入堆
可以 ...
22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
**输入:**n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
**输入:**n = 1
输出:["()"]
提示:
1 <= n <= 8
按照顺序摆放括号,记下左右括号可摆放的数量
当左右括号可放数量相等时只能放左括号,
当左右括号数量不等时,一定是左括号数<右括号数,此时只要可放数量不为零,可放左也可放右
都放完时记录当前括号结果
1234567891011121314151617181920212223class Solution {public: vector<string> ans; vector<string> generateParenthesis(int n) { generate(& ...
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 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
类似归并排序中的并,直接比较头节点然后选一个入表即可
可以用虚拟头指针来避免判空
1234567891011121314151617181920class Solution {public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {ListNode node(-1);ListNode* head = &node;ListNode* cur = head;while (list1 ! ...
20. 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
**输入:**s = “()”
**输出:**true
示例 2:
**输入:**s = “()[]{}”
**输出:**true
示例 3:
**输入:**s = “(]”
**输出:**false
示例 4:
**输入:**s = “([])”
**输出:**true
示例 5:
**输入:**s = “([)]”
**输出:**false
提示:
1 <= s.length <= 10(4)
s 仅由括号 ‘()[]{}’ 组成
左符号依次入栈,右符号每次与栈顶匹配
123456789101112131415161718class Solution {public: bool isValid(string s) { stack<char> st; unordere ...
19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
**输入:**head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
**输入:**head = [1], n = 1
输出:[]
示例 3:
**输入:**head = [1,2], n = 1
输出:[1]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
**进阶:**你能尝试使用一趟扫描实现吗?
首先想到的是两趟扫描,第一次获取链表长度,第二次获取要删除结点的前缀pre
pre->next = pre->next->next即可
pre需要遍历到 len-n 得到
所以我们先让 i 遍历到 n 之后 pre 与 i 一起遍历,当 i 遍历结束后pre即为所求
同样可以引入虚拟头节点减少判空
1234567891011121314151617class Solution {public:ListNode* removeNth ...







