思路:链表的遍历 / 按位相加
/**
* 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* addTwoNumbers(ListNode* l1, ListNode* l2) {
//初始化两个节点,一个头节点,一个尾节点
ListNode* head = nullptr;
ListNode* tail = nullptr;
//用carry记录进位
int carry = 0;
//两个链表,其中一个有值就进行计算
while(l1 || l2)
{
//先走完的链表后续元素的值就当作0
int n1 = l1 ? l1->val : 0;
int n2 = l2 ? l2->val : 0;
int sum = n1 + n2 + carry;
//如果头结点为空
if(!head)
{
head = tail = new ListNode(sum % 10);
}
else
{
tail->next = new ListNode(sum % 10);
tail = tail->next;
}
carry = sum / 10;
//移动指针
if(l1)
{
l1 = l1->next;
}
if(l2)
{
l2 = l2->next;
}
}
//最后别忘记加上最后一个进位
if(carry)
{
tail->next = new ListNode(carry);
}
return head;
}
};
思路:滑动窗口 / 双指针
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> hash;
int res = 0;
int r = -1;
for(int i = 0; i < s.size(); i++)
{
if(i)
{
hash.erase(s[i - 1]);
}
while(r + 1 < s.size() && !hash.count(s[r + 1]))
{
hash.insert(s[r + 1]);
r++;
}
res = max(res, r - i + 1);
}
return res;
}
};
思路: 双指针——数组同向追赶
/**
* @param {string} s
* @param {string[]} dictionary
* @return {string}
*/
var findLongestWord = function(s, dictionary) {
dictionary.sort((words1, words2) => {
if(words1.length == words2.length)
{
return words1.localeCompare(words2);
}
return words2.length - words1.length;
})
for(const t of dictionary)
{
let i = 0;
let j = 0;
while(i < s.length && j < t.length)
{
if(s[i] === t[j])
{
j++;
}
i++;
}
if(j == t.length)
{
return t;
}
}
return "";
};
思路:双指针直接做
class Solution {
public:
int maxOperations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int l = 0;
int r = nums.size() - 1;
int res = 0;
while(l < r)
{
int t = nums[l] + nums[r];
if(t == k)
{
l++;
r--;
res++;
}
else if(t < k)
{
l++;
}
else if(t > k)
{
r--;
}
}
return res;
}
};