leetcode之Linked List Cycle II

来源:互联网 发布:电动踏板车 知乎 编辑:程序博客网 时间:2024/05/22 16:25
这题在I的基础上不仅要判断,更要找出来是哪个节点开始结合。采用的方法是计算出第一次相遇的时候每次挪一步的那个一共走了x步,再算出来环的大小y。那么x - y就等于从头开始走的时候,距离结合点的距离等于相遇点的距离的那个点。然后2个点一起走,相遇的那个点就一定是结合点啦。代码如下:
# Definition for singly-linked list.# class ListNode(object):#     def __init__(self, x):#         self.val = x#         self.next = Noneclass 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

0 0
原创粉丝点击