您的位置:首页 > 其它

LintCode(103)带环链表 II

2016-05-31 21:08 337 查看

题目

给定一个链表,如果链表中存在环,则返回到链表中环的起始节点的值,如果没有环,返回null。

您在真实的面试中是否遇到过这个题?

Yes

样例

给出 -21->10->4->5, tail connects to node index 1,返回10

分析

上一题的进阶。
首先,利用快慢指针判断有无环,若遇到slow == fast时,跳出循环;
然后,调整fast=head,slow不变,此时slow与fast同步移动,直至再次相遇,即是链表中环的起始节点。

Python代码

"""
Definition of ListNode
class ListNode(object):

def __init__(self, val, next=None):
self.val = val
self.next = next
"""
class Solution:
"""
@param head: The first node of the linked list.
@return: The node where the cycle begins.
if there is no cycle, return null
"""
def detectCycle(self, head):
# write your code here
if head == None or head.next == None:
return None

slow = head
fast = head

while fast != None and fast.next != None:
slow = slow.next
fast = fast.next.next
if slow == fast:
break

if fast != None and fast == slow:
fast = head
while fast != slow:
slow = slow.next
fast = fast.next
return fast

return None
GitHub -- Python代码

C++代码

/**
103 带环链表 II

给定一个链表,如果链表中存在环,则返回到链表中环的起始节点的值,如果没有环,返回null。

您在真实的面试中是否遇到过这个题? Yes
样例
给出 -21->10->4->5, tail connects to node index 1,返回10

*/

/**
* Definition of ListNode
* class ListNode {
* public:
*     int val;
*     ListNode *next;
*     ListNode(int val) {
*         this->val = val;
*         this->next = NULL;
*     }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The node where the cycle begins.
*           if there is no cycle, return null
*/
ListNode *detectCycle(ListNode *head) {
// write your code here
if(head == NULL || head->next ==NULL)
{
return NULL;
}//if

ListNode *slow = head, *fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
break;
}//if
}//while

if(fast && fast == slow)
{
fast = head;
while(fast != slow)
{
fast = fast->next;
slow = slow->next;
}//while

return fast;
}//if
return NULL;

}
};
GitHub -- C++代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: