      "## Algorithm\n",
      "\n",
      "* Check for an empty list\n",
      "* Use two pointers i, j, initialized to the head\n",
      "* j is incremented twice as fast as i\n",
      "    * If j's next is NULL, we do not have a circular list\n",
      "* When i and j meet, move j to the head\n",
      "* Increment i and j one node at a time until they meet\n",
      "* Where they meet is the start of the loop\n",
      "\n",
      "Complexity:\n",
 
</s> remove     "* Check for an empty list\n",
 </s> add  </s> remove     "    * No"
 </s> add     "    * No\n",
    "* Can we assume we already have a linked list class that can be used for this problem?\n",
    "    * Yes"
    "* Increment i and j until they meet\n",
    "    * j is incremented twice as fast as i\n",
    "        * If j's next is NULL, we do not have a circular list\n",
      "## Algorithm\n",
      "\n",
      "* Check for an empty list\n",
      "* Use two pointers i, j, initialized to the head\n",
    "* Increment i and j until they meet\n",
    "    * j is incremented twice as fast as i\n",
    "        * If j's next is NULL, we do not have a circular list\n",
    "* Increment i and j until they meet\n",
    "    * j is incremented twice as fast as i\n",
    "        * If j's next is NULL, we do not have a circular list\n",
      "* When i and j meet, move j to the head\n",
      "* Increment i and j one node at a time until they meet\n",
      "* Where they meet is the start of the loop\n",
      "\n",
      "Complexity:\n",
keep keep keep keep replace replace keep keep keep keep keep
 Reworked notebook: Added more detail to constraints and test cases.  Reworked algorithm discussion and unit test. 
linked-lists/find-loop-start.ipynb