【劍指Offer】55鏈表中環的入口結點

題目描述

給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,不然,輸出null。python

時間限制:1秒;空間限制:32768K;本題知識點:鏈表app

解題思路

思路一

用一個list記錄鏈表結點,空間複雜度大。oop

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def EntryNodeOfLoop(self, pHead):
        # write code here
        l = [] #記錄節點
        if pHead == None:
            return None
        while pHead.next != None:
            for i in range(len(l)):
                if pHead==l[i]:
                    return pHead
            l.append(pHead)
            pHead = pHead.next
        return None

思路二

  • 第一步,找環中相匯點。分別用fast,slow指向鏈表頭部,slow每次走一步,fast每次走二步,直到slow==fast找到在環中的相匯點。
  • 第二步,找環的入口。當slow==fast時,讓其中一個指針指向鏈表頭部,另外一個位置不變,fast和slow每次都走一步直到再次slow==fast,此時指向的是環的入口。
# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def EntryNodeOfLoop(self, pHead):
        # write code here
        if pHead == None:
            return "null"
        # 找環中相匯點
        if pHead.next!=None and pHead.next.next!=None: #先跑一次以知足循環條件
            fast = pHead.next.next
            slow = pHead.next
        else:
            return None
        while fast != slow:
            if fast.next!=None or fast.next.next!=None:
                fast = fast.next.next
                slow = slow.next
            else:
                return None
        # 找環的入口
        fast = pHead
        while fast != slow:
            fast = fast.next
            slow = slow.next
        return slow
相關文章
相關標籤/搜索