LCR 140. 训练计划 IIhttps://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/
给定一个头节点为 head
的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第 cnt
个训练项目编号。
思路:双指针,快指针先走cnt步然后快慢指针同时向前走,当快指针为空时慢指针所在位置即为倒是第cnt个编号
class Solution {
public:
ListNode* trainingPlan(ListNode* head, int cnt) {
ListNode *fast=head,*slow=head;
for(int i=1;i<=cnt;i++)
fast=fast->next;
while(fast)
{
fast=fast->next;
slow =slow->next;
}
return slow;
}
};
141. 环形链表https://leetcode.cn/problems/linked-list-cycle/
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况。如果链表中存在环 ,则返回 true
。 否则,返回 false
。
思路:双指针,一个快指针一个慢指针,快指针每次走两步(有风险:快指针可能为空要特殊处理一下)慢指针走一步。如果两个指针能相遇则有环,如果不能相遇则没有环
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode *fast=head,*slow=head;
while(fast&&fast->next){
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
return 1;
}
return false;
}
};
26. 删除有序数组中的重复项https://leetcode.cn/problems/remove-duplicates-from-sorted-array/
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
思想:双指针,快指针如果与慢指针相等快指针++,当快指针不等于慢指针时,慢指针++快慢赋值给慢指针,然后快指针++。直到快指针遍历完数组结束。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int fast=1,slow=0;
if(nums.size()==1)
return 1;
while(fast<nums.size())
{
if(nums[fast]==nums[slow])
fast++;
else
{
slow++;
nums[slow]=nums[fast];
fast++;
}
}
return slow+1;
}
};
53. 最大子数组和https://leetcode.cn/problems/maximum-subarray/
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。
思路:将数组和与最大和比较,如果数组和大于最大和则更新,否则最大和加下一位数组元素判断有没有当前最大和大。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max=INT_MIN;
int sum=0;
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];
if(sum>max)max=sum;
if(sum<0)sum=0;
}
return max;
}
};
876. 链表的中间结点https://leetcode.cn/problems/middle-of-the-linked-list/
给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
思路:快指针走两步慢指针走一步
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode* fast=head,*slow =head;
while(fast&& fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
};
21. 合并两个有序链表https://leetcode.cn/problems/merge-two-sorted-lists/
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
思路:当头节点和中间节点的处理方式不同时手动添加一个虚头节点,
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//创建虚头节点
ListNode* Head = new ListNode();
ListNode* Tail = Head;
while(l1 && l2)
{
if(l1->val<=l2->val)
{
Tail->next=l1;
l1=l1->next;
}
else
{
Tail->next=l2;
l2=l2->next;
}
Tail=Tail->next;
}
//判断剩余
if(l1) Tail->next=l1;
if(l2) Tail->next=l2;
return Head->next;
}
};