![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
双指针
Shelbyh
这个作者很懒,什么都没留下…
展开
-
【双指针5】leetcode142 环形链表2
在环形链表1(Leetcode 141)的基础上,让返回入环节点的位置,141仅仅让找到是否有环。思路还是双指针:设置slow、fast两个双指针,在二者第1次相遇后说明是有环的,接下来需要分析一下:因为fast每次走2步,slow每次走1步,因此在二者第1次相遇之后(紫色相遇点),他们走过的路程为:fast = a + b + c + bslow = a + b(这里忽略fast多走了好几圈的情景,实际上差不多,就从最简单的分析吧)而又因为fast的路程应该等于slow的2倍,所以:a .原创 2021-05-23 18:43:26 · 56 阅读 · 0 评论 -
【双指针4】leetcode160 相交链表
也是经典的双指针题目,思路方法:(1)设置两个指针A、B分别指向headA、headB(2)开始循环,直到A == B(2.1)若A不为空,则向后走一步;若A为空,则A指向headB(2.2)若B不为空,则向后走一步;若B为空,则B指向headA(这里可能会有疑问,为什么A、B在为空之后要指向headB、headA,而不是指向headB->next、headA->next,我的理解是只要AB他们两个的行为一致就行,要么都只指向不移动,要么就都指向完后再走1步)(3)返回A或者B。此.原创 2021-05-22 12:12:55 · 54 阅读 · 0 评论 -
【双指针3】leetcode141 环形链表
最经典的双指针题目,解题思路:(1)先判断头指针head和head->next是否为空,为空则直接返回false(2)设置两个指针slow、fast,起始都指向head(3)slow一次向后走1步,fast一次向后走两步(4)若二者相遇,则有环返回true;若fast->next || fast->next->next为空,则无环返回falseclass Solution {public: bool hasCycle(ListNode *head) { .原创 2021-05-22 11:47:59 · 94 阅读 · 0 评论 -
【双指针2】leetcode26 删除排序数组中的重复项
(1)用两个指针in、cur,分别指向要填入的位置和当前遍历到的位置,开始时都指向1,因为删除后的长度至少为1,因此nums[0]一定存在在结果中。(2)判断nums[cur]和nums[cur - 1]的值是否相等。(2.1)如果不相等,说明前后两个数不同,因此nums[cur]填到num[in],然后cur、in都指向各自的下一个位置。(2.2)如果相等,说明前后两个数是重复的数,因此直接cur++,回到(2)检查下一个数是否和前数相等。(3)当cur == n时遍历结束,此时in的值刚好是不.原创 2021-05-21 12:21:06 · 53 阅读 · 0 评论 -
【双指针1】leetcode19 删除链表的倒数第 N 个结点
1.方案1:用unordered_map遍历一遍,用哈希表把序号映射到结点,然后直接找第i - n个结点进行指针改变、删除即可。#include <unordered_map>class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { unordered_map<int, ListNode*> mmap; ListNode* p = head;.原创 2021-05-19 22:45:10 · 65 阅读 · 0 评论