zoukankan      html  css  js  c++  java
  • 55链表中环的入口结点

    题目描述

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


    利用快慢指针
    如果链表的环中有n个节点。快指针先走n步,然后同时走。当慢指针走的入口节点的时候,
    快指针围绕着环走了一圈又回到了入口节点。

    如何得到得到环中节点的个数?

    利用快慢指针,找到环中的任意一节点,从该节点走一圈,并计数,当再次回到该节点的时候,便统计完了环中节点的个数。

     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     public ListNode EntryNodeOfLoop(ListNode head)
    13         {
    14             ListNode pMeet = MeetingNode(head);
    15             if(pMeet==null) return null;
    16 
    17             ListNode fast = head.next;
    18                ListNode slow = head;
    19             for(ListNode p = pMeet.next;p!=pMeet;p=p.next)
    20                 fast = fast.next;
    21 
    22             while(slow!=fast){
    23                 slow = slow.next;
    24                 fast = fast.next;
    25 
    26             }
    27             return fast;
    28     }
    29 
    30 
    31 
    32    private ListNode MeetingNode(ListNode head){
    33         if(head ==null|| head.next==null) return null;
    34         ListNode slow = head;
    35         ListNode fast = head.next.next;
    36         while(slow!=fast){
    37             slow = slow.next;
    38             fast = fast.next.next;
    39         }
    40         return slow;
    41     }
    42 
    43 
    44 
    45 
    46 }

    c++:20180729

     1 /*
     2 struct ListNode {
     3     int val;
     4     struct ListNode *next;
     5     ListNode(int x) :
     6         val(x), next(NULL) {
     7     }
     8 };
     9 */
    10 class Solution {
    11 public:
    12     ListNode* EntryNodeOfLoop(ListNode* head)
    13     {
    14         
    15         ListNode* meetNode= meeting(head);
    16         if(meetNode==NULL) return NULL;
    17         ListNode* fast = head;
    18         ListNode* slow = head;
    19         for(ListNode* p = meetNode;p!=meetNode;p=p->next)        
    20             fast=fast->next;
    21         
    22         while(slow!=fast){
    23             fast = fast->next;
    24             slow = slow->next;
    25         }
    26         return fast;
    27     }
    28 
    29     ListNode* meeting(ListNode* head){
    30     if(head==NULL ||head->next==NULL) return NULL;
    31         ListNode* fast = head->next->next;
    32         ListNode* slow = head;
    33         while(slow!=fast){
    34             fast = fast->next->next;
    35             slow = slow->next;
    36         }
    37     return fast;
    38 }
    39 };
  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/zle1992/p/8260757.html
Copyright © 2011-2022 走看看