中等题目
中等题目
小u中等题目
2.两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
1 | 输入:l1 = [2,4,3], l2 = [5,6,4] |
示例 2:
1 | 输入:l1 = [0], l2 = [0] |
示例 3:
1 | 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] |
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
方法一:模拟
我们同时遍历两个链表 l1和l2,并使用变量 carry
表示当前是否有进位。
每次遍历时,我们取出对应链表的当前位,计算它们与进位 carry
的和,然后更新进位的值,最后将当前位的值加入答案链表。如果两个链表都遍历完了,并且进位为 $0$ 时,遍历结束。
最后我们返回答案链表的头节点即可。
时间复杂度 O(max(m, n)),其中 m
和 n
分别为两个链表的长度。我们需要遍历两个链表的全部位置,而处理每个位置只需要 O(1)
的时间。忽略答案的空间消耗,空间复杂度 O(1)
。
1 | /** |
这里的
1 | cur.next = new ListNode(s % 10); |
用的非常的巧妙。如果是大于10的数字,那么就会返回其去掉十位后的数组,如果小于10的数字,就会返回其本身。
3.无重复字符的最长字串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
1 | 输入: s = "abcabcbb" |
示例 2:
1 | 输入: s = "bbbbb" |
示例 3:
1 | 输入: s = "pwwkew" |
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
方法一:双指针 + 哈希表
定义一个哈希表记录当前窗口内出现的字符,记 i
和 j
分别表示不重复子串的开始位置和结束位置,无重复字符子串的最大长度记为 ans
。
遍历字符串 s
的每个字符 s[j]
,我们记为 c
。若 s[i..j−1]
窗口内存在 c
,则 i
循环向右移动,更新哈希表,直至 s[i..j−1]
窗口不存在 c
,循环结束。将 c
加入哈希表中,此时 s[i..j−1]
窗口内不含重复元素,更新 ans
的最大值。
最后返回 ans
即可。
时间复杂度 O(n)
,其中 n
表示字符串 s
的长度。
双指针算法模板:
1 | for (int i = 0, j = 0; i < n; ++i) { |
1 | class Solution { |