程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Linked List Cycle II -- LeetCode

Linked List Cycle II -- LeetCode

編輯:C++入門知識

原題鏈接: 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;
}
這道題目更多的是數學上相遇點的推導,有了理論基礎之後就是比較簡單的鏈表操作。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved