142. 环形链表 II

  • 双指针
  1. 判断是否有环
    使用快慢指针, 分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。
    2.找环的入口节点
    从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution 
{
public:
    ListNode *detectCycle(ListNode *head) 
    {
	if(head == nullptr || head->next == nullptr)//特殊条件判定 头指针为空
	{
		return nullptr;
	}

	ListNode* fastNode = head;//快指针
	ListNode* slowNode = head;//慢指针

	while(fastNode->next != nullptr && fastNode->next->next != nullptr)//注意不能使用! fastNode->next && !fastNode->next->next
	{
		slowNode = slowNode->next;//慢指针走一步
		fastNode = fastNode->next->next;//快指针走两步
		if(fastNode == slowNode)//找到环
		{
			slowNode = head;
			while(slowNode != fastNode)//寻找环的入口结点
			{
				slowNode = slowNode->next;
				fastNode = fastNode->next;
			}
			return slowNode;
		}
	}
	return nullptr;      
    }
};
上一篇:LeetCode 206. 反转链表 双指针法 辅助结点 递归


下一篇:面试题25-合并两个排序的链表