@Leetcode 01 02 题解
Leetcode 01 02 题解
很久没有更博了,从今天开始争取每天在LeetCode刷两道题,两年时间正好做完毕业。加油!
01 两数之和
难度:简单
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
题解:暴力算法,双层循环,j 从 i + 1 开始,保证同一个元素不会使用两遍。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> v;
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
v.push_back(i);
v.push_back(j);
return v;
}
}
}
return v;
}
};
02 两数相加
难度:中等
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
题解:可以直接从链表头往链表尾两两相加。设置一个变量表示进位,若最后一位仍有进位,记得增加一位。主要回顾链表的使用。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* p = new ListNode();
ListNode* l = p;
int t = 0;
while(l1 || l2 || t != 0) {
ListNode *node = new ListNode();
node->val = t;
if (l1) {
node->val += l1->val;
l1 = l1->next;
}
if (l2) {
node->val += l2->val;
l2 = l2->next;
}
t = node->val / 10;
node->val %= 10;
l->next = node;
l = l->next;
}
return p->next;
}
};