Python實現"環形連結串列"的一種方法
阿新 • • 發佈:2019-02-04
判斷給定的連結串列中是否有環(不一定是首尾相連)
注意:
儘量不要申請額外空間
複雜度O(n)的方法,使用兩個指標slow,fast。兩個指標都從表頭開始走,slow每次走一步,fast每次走兩步,如果fast遇到null,則說明沒有環,返回false;如果slow==fast,說明有環,並且此時fast超了slow一圈,返回true。
為什麼有環的情況下二者一定會相遇呢?因為fast先進入環,在slow進入之後,如果把slow看作在前面,fast在後面每次迴圈都向slow靠近1,所以一定會相遇,而不會出現fast直接跳過slow的情況。
def hasCycle(self, head): """ :type head: ListNode :rtype: bool """ if not head: return False pointer1 = head pointer2 = head while pointer1 is not None: pointer1=pointer1.next #指標1加一 if not pointer2.next: return False pointer2 = pointer2.next #指標2加一 if not pointer2.next: return False pointer2 = pointer2.next #指標2再加一 if pointer2==pointer1: return True return False
複雜度O(n^2)的方法,使用兩個指標a, b。a從表頭開始一步一步往前走,遇到null則說明沒有環,返回false;a每走一步,b從頭開始走,如果遇到b==a.next,則說明有環true,如果遇到b==a,則說明暫時沒有環,繼續迴圈。
def hasCycle(self, head): """ :type head: ListNode :rtype: bool """ if not head: return False pointer1 = head pointer2 = head while pointer1.next is not None: #挨個訪問結點 while pointer2!=pointer1: #從頭開始一直訪問到Pointer1結點 if pointer2==pointer1.next: return True pointer2 = pointer2.next if pointer2==pointer1.next: #防止連結串列最後一個結點自身成環 return True pointer1=pointer1.next pointer2=head return False
3:新建一個列表,用於存放訪問過的結點,判斷下一個結點是否在列表中(錯誤:超出時間限制)
def hasCycle(self, head): """ :type head: ListNode :rtype: bool """ if not head: return False tempNodeList = [head] while head.next!=None and head.next not in tempNodeList: head = head.next tempNodeList.append(head) if head.next == None: return False else: return True