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 };
  • 相关阅读:
    Redis分布式锁实现
    mysql索引命中规则
    spring注解原理
    img 标签访问图片返回403forbidden
    根据注解修改属性的值
    通过反射改变对象的属性
    利用反射获取类或者方法或者字段上的注解的值
    什么时候出现死锁,如何解决?mysql 引擎? 多个like or 查询sql如何优化?什么是常量池?for条件执行顺序
    jvm 基础
    为什么要用jvm .
  • 原文地址:https://www.cnblogs.com/zle1992/p/8260757.html
Copyright © 2011-2022 走看看