fast

Leetcode 142题 环形链表 II(Linked List Cycle II) Java语言求解

我与影子孤独终老i 提交于 2020-01-24 09:02:40
题目描述: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 分析 给出示意图: 对符号的一些说明: 公式演算: 很容易得到: m=x+y(环的长度两种表示形式); 快指针走两步,慢指针走一步。所以快指针的速度是慢指针的速度的二倍,所以相同时间内,快指针走的长度也是慢指针走的长度的二倍: 有: f=2s; 在快指针走过 圈后两指针相遇,有: m+kn+y=2(m+y); 去括号后有: m+kn=2m+y; 解得: m=kn-y; 又因为:n=x+y; 所以有:m=kn-(n-x); 所以:m=x+n(k-1)。 m是头节点到环起点的长度; x是相遇点到头节点的长度; x-m是(k-1)个环的长度。 通过公式的演算,我们能够明白: 找到相遇点后,链表头节点与相遇点节点同时出发,相遇处便是环的起点。相遇点节点多走了(k-1)个环。 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next =

力扣142——环形链表 II

旧时模样 提交于 2020-01-24 01:47:09
原题 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:tail connects to node index 0 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:no cycle 解释:链表中没有环。 进阶: 你是否可以不用额外空间解决此题? 原题url:https://leetcode-cn.com/problems/linked-list-cycle-ii/ 解题 在这里贴一下题目所提供的节点结构,这样下面的代码就不重复贴了: Definition for singly-linked list. class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; }

必知C++算法之链表基本问题

百般思念 提交于 2020-01-23 19:31:38
1.快慢指针判断链表有环、寻找环入口、计算环大小的原理 问题: ​ 给定一个链表: ​ 1. 判断链表是否有环。 ​ 2. 如果链表有环,请找出环入口。 ​ 3. 计算环的大小。 思路:快慢指针 ​ 分别定义一个快指针fast和慢指针slow,快指针一次走两步,慢指针一次走一步。如果链表没有环,那么fast最终会指向nullptr;如果链表有环,那么快指针和慢指针最终会相遇。所以,如果最终fast == nullptr,那么判断链表无环;如果最终fast == slow,且fast != nullptr,那么链表有环。 核心代码 寻找环入口 LLNode * LinkedList::entranceOfLoop() { LLNode * slow = pHead; LLNode * fast = pHead; while(fast && fast->pNext) { fast = fast->pNext->pNext; slow = slow->pNext; if(fast == slow) break; } if(!fast || !fast->pNext) return nullptr; fast = pHead; while(fast != slow) { fast = fast->pNext; slow = slow->pNext; } return fast; }

经典算法(三) 单链表 反转 & 是否相交/成环 & 求交点 等

徘徊边缘 提交于 2020-01-23 07:21:39
参考文章: 判断链表是否相交: http://treemanfm.iteye.com/blog/2044196 一、单链表反转 链表节点 public class Node { private int record; private Node nextNode; public Node(int record) { super(); this.record = record; } } View Code 构建链表 public static Node creatLinkedList() { Node head = new Node(0); Node tmp = null; Node cur = null; for (int i = 1; i < 10; i++) { tmp = new Node(i); if (1 == i) { head.setNextNode(tmp); } else { cur.setNextNode(tmp); } cur = tmp; } return head; } View Code 递归实现 public static Node reverse(Node head) { if (null == head || null == head.getNextNode()) { return head; } Node reversedHead =

[Algorithm] 234. Palindrome Linked List / Reverse linked list

最后都变了- 提交于 2020-01-23 05:19:32
Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false Example 2: Input: 1->2->2->1 Output: true /** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @return {boolean} */ var isPalindrome = function(head) { let slow = fast = head; let stack = []; while (fast && fast.next) { stack.push(slow.val); slow = slow.next; fast = fast.next.next; } if (fast) { slow = slow.next; } while (slow) { val = stack.pop(); if (val !== slow.val) { return false } slow = slow.next; }

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。

自闭症网瘾萝莉.ら 提交于 2020-01-22 18:20:53
示例: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 输入:[1,2,3,4,5,6] 输出:此列表中的结点 4 解题思路: 快慢指针法,让快指针走两步慢指针走一步,当个数为奇数时, fast->next==NULL,当为偶数时fast == NULL。 typedef struct ListNode Node; struct ListNode* middleNode(struct ListNode* head){ Node* slow = head; Node* fast = head; while(fast != NULL && fast->next != NULL) { slow = slow->next; fast = fast->next->next; } return slow; } 来源: CSDN 作者: smilevampire 链接: https://blog.csdn.net/smilevampire/article/details/104071222

【leetcode】141. 环形链表( Linked List Cycle )

夙愿已清 提交于 2020-01-22 02:40:43
题目描述 【leetcode】141. 环形链表( Linked List Cycle ) 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 进阶: 你能用 O(1)(即,常量)内存解决此问题吗? 第一次解答 思路: 首先想到的是哈希表,但是不符合进阶要求,于是看了题解,采用快慢指针 注意: 链表为空 test case: [3,2,0,-4] 1 [1,2] 0 [1] -1 [] -1 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public : bool hasCycle ( ListNode * head ) { if ( nullptr == head ) { return false ; } ListNode * p_fast = head - > next ; ListNode * p_slow = head ; while ( p_fast != nullptr && p

OJ题-给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null(力扣)

笑着哭i 提交于 2020-01-20 07:23:01
题目: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null 思路:1.快慢指针,一个一步,一个两步,一个一步一个多步的话会错过 2.如果相遇带环(如果快的遇到null就不带环) /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode detectCycle ( ListNode head ) { ListNode fast = head ; ListNode slow = head ; do { if ( fast == null ) { return null ; } fast = fast . next ; slow = slow . next ; } while ( fast != slow ) ; ListNode p = head ; ListNode q = slow ; while ( p != q ) { p = p . next ; q = q . next ; } return p ; } } 来源: CSDN 作者:

LeetCode_283移动零

独自空忆成欢 提交于 2020-01-18 03:02:45
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/move-zeroes 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 class Solution { public void moveZeroes ( int [ ] nums ) { int slow = 0 ; //记录0的位置 int fast = 0 ; while ( slow < nums . length && nums [ slow ] != 0 ) { slow ++ ; fast ++ ; } while ( fast < nums . length ) { if ( nums [ fast ] != 0 ) { nums [ slow ] = nums [ fast ] ; slow ++ ; } fast ++ ; } while ( slow < nums . length ) { nums [ slow ++ ] = 0 ; } } } 来源: CSDN 作者: 皓月v 链接: https

61.旋转链表

你。 提交于 2020-01-14 06:27:54
难度:中等 题目描述: 思路总结 :思路呢,很简单,无非就两点,连环,双指针。最后需要求余n,以防k>>n的情况 题解一: 个人版-超时,改进几行代码后,AC。 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution : def rotateRight ( self , head : ListNode , k : int ) - > ListNode : #思路:先将链表变成循环链表,然后在进行切割。 if not head : return head cur = head n = 1 while cur . next : cur = cur . next n += 1 tail = cur cur . next = head fast = head for i in range ( k % n ) : fast = fast . next while fast != cur : fast = fast . next head = head . next res = head . next head . next = None return res 题解一结果: 来源: CSDN