目录
1 力扣_141 环形链表
链接:链接:力扣-环形链表
1.1 示例
1.2 思路
快慢指针:创建
slow
慢指针,一次走1步;fast
快指针,一次走2步
1.3 实现
bool hasCycle(struct ListNode *head) { struct ListNode *slow,*fast; slow=fast=head; while(fast && fast->next) // fast不会到尾,即是一个环 { slow=slow->next; fast=fast->next->next; if(fast==slow) // 追上 return true; } return false; // 没追上 }
1.4 其他情况
1.4.1 当slow
一次走1步,fast
一次走3步
1.4.2 当slow
一次走1步,fast
一次走4步
同理,每走一次,二者距离减少(4-1)=3步
1.4.3 slow
走1步,fast
走n步
一样的道理
2 力扣_142 环形链表Ⅱ
求交点
2.1 示例
2.2 方法1:公式法
2.2.1 实现
struct ListNode *detectCycle(struct ListNode *head) { struct ListNode *slow,*fast,*newhead,*meetNode; slow=fast=newhead=head; while(fast && fast->next) { slow=slow->next; fast=fast->next->next; if(fast == slow) // 找到相遇点 { meetNode=slow; while(meetNode != newhead) { meetNode=meetNode->next; newhead=newhead->next; } } return meetNode; } return NULL; }
2.3 方法2:直接法
不过这里要用到上节课的 *链表相交* 代码
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) { int la = 0, lb = 0; struct ListNode* LA = headA; struct ListNode* LB = headB; while (LA != 0) { LA = LA->next; la++; } while (LB != 0) { LB = LB->next; lb++; } if (LA != LB) { return NULL; } struct ListNode* longlist = headA; struct ListNode* shortlist = headB; if (la < lb) { longlist = headB; shortlist = headA; } int gap = abs(la - lb); while (gap--) { longlist = longlist->next; } while (longlist != shortlist) { longlist = longlist->next; shortlist = shortlist->next; } return longlist; }
2.3.1 实现
struct ListNode *detectCycle(struct ListNode *head) { struct ListNode *slow,*fast,*newhead,*meetNode; slow=fast=head; while(fast && fast->next) { slow=slow->next; fast=fast->next->next; if(fast == slow) // 找到相遇点 { newhead=slow->next; // 先存下一个节点 slow->next=NULL; // 切断,next置空 meetNode=getIntersectionNode(newhead,head); // 用找相交点的函数找交点 return meetNode; } } return NULL; }