原題鏈接: http://oj.leetcode.com/problems/linked-list-cycle-ii/
這道題是Linked
List Cycle的擴展,就是在確定是否有cycle之後還要返回cycle的起始點的位置。從Linked
List Cycle中用的方法我們可以得知a=kc-b(不了解的朋友可以先看看Linked
List Cycle)。現在假設有兩個結點,一個從鏈表頭出發,一個從b點出發,經過a步之後,第一個結點會到達cycle的出發點,而第二個結點會走過kc-b,加上原來的b剛好也會停在cycle的起始點。如此我們就可以設立兩個指針,以相同速度前進知道相遇,而相遇點就是cycle的起始點。算法的時間復雜度是O(n+a)=O(2n)=O(n),先走一次確定cycle的存在性並且走到b點,然後走a步找到cycle的起始點。空間復雜度仍是O(1)。代碼如下:
public ListNode detectCycle(ListNode head)
{
if(head == null || head.next == null)
return null;
ListNode walker = head.next;
ListNode runner = head.next.next;
while(runner!=null && walker!=runner)
{
walker = walker.next;
if(runner.next!=null)
runner = runner.next.next;
else
runner = null;
}
if(runner == null)
return null;
runner = head;
while(walker!=runner)
{
walker = walker.next;
runner = runner.next;
}
return walker;
}這道題目更多的是數學上相遇點的推導,有了理論基礎之後就是比較簡單的鏈表操作。