剑指offer--链表中环的入口结点

题目描述

一个链表中包含环,请找出该链表的环的入口结点。
分析:

如果存在环,找到环的起始结点

当fast指针等于slow指针时,slow指针肯定还没有遍历完整个链表,而此时fast指针已经在环内循环了n圈(n>=1),假定从链表头指针开始slow走了s步,则fast走了2s步,fast所走的步数还等于s加上fast指针比slow指针在环内多走的n圈。设环长为r,则:

2s = s + nr;

=>s = nr;

设整个链表长度为L,环的入口结点到相遇结点的距离为x, 起点到环的入口结点的距离为a.

a + x = nr;

=> a + x = (n-1)r + L - a;

=> a = (n-1)r + (L - a - x);

=> 由链表的头结点到环入口结点的距离等于n-1圈环的长度+相遇点到环入口结点的距离,于是,当我们在链表头部和相遇处分别设一指针,每次各走一步,则两指针必定相遇,且相遇的第一个结点即为环的入口结点

[java]  view plain  copy
  1. /* 
  2.  public class ListNode { 
  3.     int val; 
  4.     ListNode next = null; 
  5.  
  6.     ListNode(int val) { 
  7.         this.val = val; 
  8.     } 
  9. } 
  10. */  
  11. public class Solution {  
  12.   
  13.     ListNode EntryNodeOfLoop(ListNode pHead)  
  14.     {  
  15.         if (pHead == null || pHead.next == null) {  
  16.              return null;  
  17.          }  
  18.          ListNode fast = new ListNode(0);  
  19.          ListNode slow = new ListNode(0);  
  20.          slow = pHead.next;  
  21.          fast = pHead.next.next;  
  22.          while (fast != slow) {  
  23.              slow = slow.next;  
  24.              fast = fast.next.next;  
  25.          }  
  26.          fast = pHead;  
  27.          while (fast != null) {  
  28.              if (fast == slow) {  
  29.                  return fast;  
  30.              }  
  31.              slow = slow.next;  
  32.              fast = fast.next;  
  33.          }  
  34.          return slow;  
  35.     }  
  36. }  




原文链接http://blog.csdn.net/crazy__chen/article/details/45100007

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值