快慢指针常常可以用来解决链表的多个题目,现在总结如下:
判断单链表是否存在环
如果链表存在环,就好像操场的跑道是一个环形一样。此时让快慢指针都从链表头开始遍历,快指针每次向前移动两个位置,慢指针每次向前移动一个位置;如果快指针到达NULL,说明链表以NULL为结尾,没有环。如果快指针追上慢指针,则表示有环.
bool HasCircle(ListNode * pHead)
{
ListNode * pFast = pHead; // 快指针每次前进两步
ListNode * pSlow = pHead; // 慢指针每次前进一步
while(pFast->m_pNext != NULL)
{
pFast = pFast->m_pNext->m_pNext;
pSlow = pSlow->m_pNext;
if(pSlow == pFast) // 相遇,存在环
return true;
}
return false;
}
判断两个单链表是否相交,如果相交,找到他们的第一个公共节点
首先利用快慢指针判断链表是否存在环。
(1)如果都不存在环,则如果两个单向链表有公共节点,也就是两个链表从某一节点开市,他们的p_mNext都指向同一个节点,每个节点只有一个p->mNext。因此从第一个公共节点开始,之后它们所有节点都是重合的。因此,首先两个链表各遍历一次,求出两个链表的长度L1、L2,然后可以得到它们的长度差L。然后现在长的链表上遍历L个节点,之后再同步遍历&#