LeetCode.142 環形連結串列 II
阿新 • • 發佈:2019-01-07
問題描述
給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null。
說明:不允許修改給定的連結串列。
進階:
你是否可以不用額外空間解決此題?
主要不能使用額外空間較為困難,先判斷環,之後找到相遇點,將其中一個指標指向頭結點,兩指標同時走,相遇即為環入口。
推導過程為 :設開頭到相遇點的距離為a,開頭到入口的距離為b,相遇點到入口的向右距離為c,則有公式 a+c+a-b=2a 快指標走的距離為慢指標的兩倍。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next ;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode * t;
struct ListNode * t2;
t=head;
t2=head;
while(t2!=NULL){
if(t2->next!=NULL){
t2=t2->next;
if(t2->next!=NULL){
t2=t2->next;
t=t->next ;
if(t==t2){
t=head;
if(t==t2){
return t2;
}
while(t!=t2){
t=t->next;
t2=t2->next;
if(t==t2){
return t2;
}
}
}
continue;
}
else{
return NULL;
}
}else{
return NULL;
}
}
return NULL;
}