刷题第三天
1、字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
class Solution {
public:
string addStrings(string num1, string num2) {
int i = num1.size() - 1, j = num2.size() - 1, add = 0;
string res = "";
while(i >= 0 || j >= 0 || add != 0){
int x = i >= 0 ? num1[i] - '0' : 0;
int y = j >= 0 ? num2[j] - '0' : 0;
int result = x + y + add;
res += '0' + result % 10;
add = result / 10;
i--;
j--;
}
reverse(res.begin(), res.end());
return res;
}
};
2、合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int len = nums1.size() - 1;
m--;
n--;
while(n >= 0){
while(m >= 0 && nums1[m] > nums2[n])
swap(nums1[len--], nums1[m--]);
swap(nums1[len--], nums2[n--]);
}
}
};
3、两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(0);
ListNode* cur = head;
int flag = 0;
while(l1 || l2){
int x = l1 != nullptr ? l1->val : 0;
int y = l2 != nullptr ? l2->val : 0;
int sum = x + y + flag;
flag = sum / 10;
cur->next = new ListNode(sum % 10);
cur = cur->next;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
if(flag) cur->next = new ListNode(flag);
return head->next;
}
};
4、环形链表-2
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
slow * 2 = fast;
slow = a + b;
fast = a + b + c + b = a + 2*b + c;
(a + b)2 = a + 2b + c;
a = c;
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *fast = head, *slow = head;
while(fast && fast->next){
fast = fast->next->next;
slow = slow->next;
if(fast == slow){
ListNode *ptr = head;
while(ptr != slow){
ptr = ptr->next;
slow = slow->next;
}
return ptr;
}
}
return nullptr;
}
};