19、判斷一個單鏈表是否有環?找到環的進入點。判斷兩個單鏈表是否相交,找到相交點。

來源:互聯網
上載者:User

有一個單鏈表,其中可能有一個環,也就是某個節點的next指向的是鏈表中在它之前的節點,這樣在鏈表的尾部形成一環。



問題:

1、如何判斷一個鏈表是不是這類鏈表?
2、如果鏈表為存在環,如何找到環的進入點?

解答:

一、判斷鏈表是否存在環,辦法為:

設定兩個指標(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鏈表存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。(當然,fast先行頭到尾部為NULL,則為無環鏈表)程式如下:

bool IsExitsLoop(slist *head)

{

    slist *slow = head, *fast
= head;

    while ( fast && fast->next ) 

    {

        slow = slow->next;

        fast = fast->next->next;

        if ( slow == fast ) break;

    }

    return !(fast == NULL || fast->next == NULL);

}


二、找到環的進入點

當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)迴圈內環+相遇點到環進入點,於是我們從鏈表頭、與相遇點分別設一個指標,每次各走一步,兩個指標必定相遇,且相遇第一點為環進入點。程式描述如下:

slist* FindLoopPort(slist *head)

{

    slist *slow = head, *fast = head;

    while ( fast && fast->next ) 

    {

        slow = slow->next;

        fast = fast->next->next;

        if ( slow == fast ) break;

    }

    if (fast == NULL || fast->next == NULL)

        return NULL;


    slow = head;
    while (slow != fast)

    {

         slow = slow->next;

         fast = fast->next;

    }

    return slow;

}



擴充問題:

判斷兩個單鏈表是否相交,如果相交,給出相交的第一個點(兩個鏈表都不存在環)。

比較好的方法有兩個:

一、將其中一個鏈表首尾相連,檢測另外一個鏈表是否存在環,如果存在,則兩個鏈表相交,而檢測出來的依賴環入口即為相交的第一個點。

二、如果兩個鏈表相交,那個兩個鏈表從相交點到鏈表結束都是相同的節點,我們可以先遍曆一個鏈表,直到尾部,再遍曆另外一個鏈表,如果也可以走到同樣的結尾點,則兩個鏈表相交。也就是說,遍曆第一個鏈表找到最後一個元素,再遍曆最後一個元素,找到最後一個元素,如果這兩個尾元素相同,就說明是相交的。


這時我們記下兩個鏈表length,再遍曆一次,長鏈表節點先出發前進(lengthMax-lengthMin)步,之後兩個鏈表同時前進,每次一步,相遇的第一點即為兩個鏈表相交的第一個點。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.