zoukankan      html  css  js  c++  java
  • Leetcode | Linked List Cycle I && II

    一、判断链表是否存在环,办法为:

    设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。

    二、找到环的入口点

    当fast若与slow相遇时,slow肯定没有走遍历完链表,而fast已经在环内循环了n圈(1<=n)。假设slow走了s步,则fast走了2s步(fast步数还等于s 加上在环上多转的n圈),设环长为r,则:

    2s = s + nr
    s= nr

    设整个链表长L,入口环与相遇点距离为x,起点到环入口点的距离为a。
    a + x = nr
    a + x = (n – 1)r +r = (n-1)r + L - a
    a = (n-1)r + (L – a – x)

    (L – a – x)为相遇点到环入口点的距离,由此可知,从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点,于是我们从链表头、与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。

    扩展问题:

    判断两个单链表是否相交,如果相交,给出相交的第一个点(两个链表都不存在环)。

    比较好的方法有两个:

    一、将其中一个链表首尾相连,检测另外一个链表是否存在环,如果存在,则两个链表相交,而检测出来的依赖环入口即为相交的第一个点。

    二、如果两个链表相交,那个两个链表从相交点到链表结束都是相同的节点,我们可以先遍历一个链表,直到尾部,再遍历另外一个链表,如果也可以走到同样的结尾点,则两个链表相交。

    这时我们记下两个链表length,再遍历一次,长链表节点先出发前进(lengthMax-lengthMin)步,之后两个链表同时前进,每次一步,相遇的第一点即为两个链表相交的第一个点。

     1 class Solution {
     2 public:
     3     ListNode *detectCycle(ListNode *head) {
     4         if (head == NULL) return NULL;
     5         
     6         ListNode* fast = head, *slow = head; 
     7         
     8         bool isCycle = false;
     9         while (slow != NULL && fast->next != NULL) {
    10             slow = slow->next;
    11             fast = fast->next->next;
    12             if (slow == fast) {
    13                 isCycle = true;
    14                 break;
    15             } 
    16             if (fast == NULL) break;
    17         }
    18         
    19         if (isCycle) {
    20             slow = head;
    21             while (slow != NULL && fast != NULL) {
    22                 if (slow == fast) break;
    23                 slow = slow->next;
    24                 fast = fast->next;
    25             }
    26             return fast;
    27         } else {
    28             return NULL;
    29         }
    30     }
    31 };
  • 相关阅读:
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
    UVA 11100 The Trip, 2007 (贪心)
    JXNU暑期选拔赛
    计蒜客---N的-2进制表示
    计蒜客---线段的总长
    计蒜客---最大质因数
    JustOj 2009: P1016 (dp)
  • 原文地址:https://www.cnblogs.com/linyx/p/3627017.html
Copyright © 2011-2022 走看看