剑指offer 链表中环的入口位置】的更多相关文章

题目描述 一个链表中包含环,请找出该链表的环的入口结点.   思路:这题需要知道a = c,然后head和slow每次走一步,相遇的时候就是第一个入口交点, 注意:for循环或者while循环之后,一定要判断是是否正常退出,是找到满足条件的break退出,还是不满足for循环条件退出,加一个判断. /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */…
题目描述: 一个链表中包含环,请找出该链表的环的入口结点. 分析: 设置两个指针p1,p2, 两个指针都从链表的头部开始走,不过p1每次走一步,p2每次走两步. 直到相遇的时候,p2走的长度是p1的两倍. 此时让p2从头开始走,p1继续往下走,不过此时两指针都是一步一步走. 再次相遇的地点就是环的入口. 证明: 假设结点数一共有m个,环中的结点数有n个. 第一次相遇的时候,它们肯定是在环中相遇的,p1走了s1步,p2走了2*s1步. 那么此时它们在环中的位置是一样的,即(s1-(m-n))%n=…
题目: 一个链表中包含环,请找出该链表的环的入口结点. 思路: 先说个定理:两个指针一个fast.一个slow同时从一个链表的头部出发, fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇, 此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内), 这次两个指针一次走一步,相遇的地方就是入口节点. python solution: # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x…
首先统一链表的数据结构为: struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), next(NULL) {} }; 题目一:从尾到头打印链表:输入一个链表.从尾到头打印链表每一个节点的值. 分析: 难点在于链表仅仅有指向后继的指针,没有指向前驱的指针. 转换思路.结合栈后进先出的特点,能够遍历链表,依次将数据元素存入栈中,然后再依次出栈,即为从尾到头的顺序. vector<int> printLis…
package LinkedList; import java.util.HashSet; /** * 链表中环的入口结点 * 一个链表中包含环,请找出该链表的环的入口结点. */ public class Solution24 { /** * 假设x为环前面的路程,a为环入口到相遇点的路程, c为环的长度 * 当快慢指针相遇的时候: 此时慢指针走的路程为Sslow = x + m * c + a * 快指针走的路程为Sfast = x + n * c + a * 2 Sslow = Sfast…
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路 第一步,用两个快慢指针找环中相汇点.分别用slow, fast指向链表头部,slow每次走一步,fast每次走二步,直到fast == slow找到在环中的相汇点.第二步,找环的入口.当fast == slow时,假设slow走过x个节点,则fast走过2x个节点.设环中有n个节点,因为fast比slow多走一圈(n个节点),所以有等式2x = n + x,可以推出n = x,即slow实际上走了一个环的…
题目描述 一个链表中包含环,请找出该链表的环的入口结点. 解题思路 解决这个问题的第一步是如何确定一个链表中包含环.可以定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个一次走两步.如果走得快的指针走到了链表的末尾都没有追上第一个指针,那么链表就不包含环.反之则可得到环中的一个节点. 第二步是如何找到环的入口.还是可以用两个指针P1和P2指向链表的头结点,如果链表中的环有n个节点,则指针P1先在链表上向前移动n步,然后两个指针依次同时向前移动一步.当P2指向环的入口节点时,P1已经…
输入一个链表,输出该链表中倒数第k个结点. class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { ListNode* p1=pListHead,*p2=pListHead; ; while(p1!=NULL){ count++; if(count>k) p2=p2->next; p1=p1->next; } return count<k?NULL:p2; } }…
Question 输入一个链表,输出该链表中倒数第k个结点. Solution 一种想法就是扫描两边,第一遍求出总的节点个数,第二遍从头开始走n-k个 第二种思想类似于fast-slow指针的方法,fast指针先走k-1步,让两个指针距离保持为k,然后在一起走,fast走到最后的时候,slow刚好走到倒数第k个节点. Code /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(N…
题目描述 输入一个链表,输出该链表中倒数第k个结点.     思路: 法1:设置2个指针p,q.p先移动k次,然后pq同时后移,p到链表尾尾的时候,q指向倒数第k个节点. 注意://需要考虑k=0,以及List为空的情况 法2:利用栈,先全部压栈,pop k次,得到倒数第k个节点   AC代码: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ cl…