2021-05-28

刷题第三天
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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值