双指针
Shelbyh
这个作者很懒,什么都没留下…
展开
-
【双指针5】leetcode142 环形链表2
在环形链表1(Leetcode 141)的基础上,让返回入环节点的位置,141仅仅让找到是否有环。 思路还是双指针:设置slow、fast两个双指针,在二者第1次相遇后说明是有环的,接下来需要分析一下: 因为fast每次走2步,slow每次走1步,因此在二者第1次相遇之后(紫色相遇点),他们走过的路程为: fast = a + b + c + b slow = a + b (这里忽略fast多走了好几圈的情景,实际上差不多,就从最简单的分析吧) 而又因为fast的路程应该等于slow的2倍,所以: a .原创 2021-05-23 18:43:26 · 59 阅读 · 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为空,则无环返回false class Solution { public: bool hasCycle(ListNode *head) { .原创 2021-05-22 11:47:59 · 95 阅读 · 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 · 55 阅读 · 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 · 67 阅读 · 0 评论