您的位置:首页 > 编程语言 > Python开发

leetcode之Linked List Cycle II

2016-01-06 23:40 513 查看
这题在I的基础上不仅要判断,更要找出来是哪个节点开始结合。采用的方法是计算出第一次相遇的时候每次挪一步的那个一共走了x步,再算出来环的大小y。那么x - y就等于从头开始走的时候,距离结合点的距离等于相遇点的距离的那个点。然后2个点一起走,相遇的那个点就一定是结合点啦。代码如下:
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head:
print '1111'
return None
if not head.next:
return None
twostep = head.next.next
distance1 = 0
left = head
#distance1是相遇前一共走了多少步,cycle是环的大小。
while True:
if head.next == twostep:
distance1 = distance1 + 1
cycle = 0
head1 = head.next
while True:
if head1.next != head.next:
cycle = cycle + 1
head1 = head1.next
else:
cycle = cycle + 1
for i in range(distance1 - cycle):
left = left.next
while True:
if left == head.next:
return left
else:
left = left.next
head = head.next
else:
head = head.next
distance1 = distance1 + 1
if not twostep:
return None
elif not twostep.next:
return None
else:
twostep = twostep.next.next
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息