LeetCode-環形連結串列|+環形連結串列||
阿新 • • 發佈:2020-12-28
此文轉載自:https://blog.csdn.net/weixin_45313447/article/details/111823636#commentBox
環形連結串列 | 和 || 題型相似且 || 是 | 的升級版,故放一起。
1.題 | 如下:
2.題目分析:
返回的是一個布林型的結果,如果有環返回true,無環返回false。
3.原始碼:
bool hasCycle(struct ListNode *head) {
if(head==NULL)
return false;
struct ListNode *solw=head;
struct ListNode *fast=head;
while(fast && fast->next){
solw= solw->next;
fast=fast->next->next;//使快指標比慢指標快二步
if(solw==fast){
return true;//快慢指標相遇即有環
}
}
return false;//無環
}
1.題 || 如下:
2.題目分析:
3.原始碼:
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode* slow=head;
struct ListNode* fast= head;
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
if(fast==slow)
break;//判斷有環
}
if(fast==NULL||fast->next==NULL){
return NULL;//無環情況
}
else{
struct ListNode* meet=slow;
while(1){//由題目分析推斷關係得如下且用while(1)死迴圈
if(meet==head)
break;//一定是先判斷保證情況二也可以考慮到
head=head->next;
meet=meet->next;
}
return meet;
}
return 0;
}
4.總結:
1.解決類似問題以及連結串列中的問題可以多考慮用快慢指標解決。
2. 解決的第二題為什麼快指標要比慢指標快二倍不可以是別的:
如果是三步:X X-2 X-4 X-6…如果X是奇數快慢指標就會錯過不會像兩步一樣每走一步之間的距離每縮小一步。類推別的也就不可以。