力扣 142环形链表2 快慢指针法

 //此题采用快慢指针法 
 ListNode *detectCycle(ListNode *head)
    {
    	int tag=0;
        ListNode *p1,*p2,*pre;
        if(head==NULL)//因为下面用到了head->next和head->next->next所以防止空指针必须先判断 ,不然会报空指针错 
            return NULL;
        p1=head->next;
        if(p1==NULL)//因为下面用到了p1->next->next所以防止空指针必须先判断 
        	return NULL;
        p2=head->next->next;
        if(p2==NULL)
        	return NULL;
        while(p1!=NULL&&p2!=NULL)//如果有环,会相遇,不然慢指针永远追不上快的 
        {
            if(p1==p2)
            {
            	tag=1;
            	break;
			}
            p1=p1->next;
            if(p2->next==NULL)
                return NULL;
            p2=p2->next->next;
        }
        if(tag)//相遇出继续往前移动,头指针处继续往前移动,最后他们会在第一个入环节点处相遇 
		{
			pre=head;
			while(pre!=p2)
			{
				pre=pre->next;
				p2=p2->next;
			}
			return pre;
		} 
		return NULL;
    }

讲解:

力扣 142环形链表2 快慢指针法_第1张图片
设入环点为A,快慢指针相遇处为B,到A处走了a,A到B走了b
因为快指针速度是慢的两倍,所以慢指针走到B时,快的以及走了2(a+b)了
AB长度以知,快指针减去b再减去a+b就可以得出环的长度时a
所以重新定义一个pre指向head,开始一步一步出发,快指针也一步一步向前走,最后相遇处就是入环点

LeetCode报错:runtime error: member access within null pointer of type ‘struct ListNode’

错误原因:试图使用空指针
解决方法:增加判断条件,并且判断的顺序不能改变。排除对空指针的引用。

比如上文中用到了p2->next->next,就必须先判断p2和p2->next是不是空指针,不然会空指针报错

你可能感兴趣的:(LeeCode)