判断两个链表是否相交
2017-07-25 14:21
281 查看
编译器:vs2013
比较好的方法有两个:
一、将其中一个链表首尾相连,检测另外一个链表是否存在环,如果存在,则两个链表相交,而检测出来的依赖环入口即为相交的第一个点。
二、如果两个链表相交,那个两个链表从相交点到链表结束都是相同的节点,我们可以先遍历一个链表,直到尾部,再遍历另外一个链表,如果也可以走到同样的结尾点,则两个链表相交。
这时我们记下两个链表length,再遍历一次,长链表节点先出发前进(lengthMax-lengthMin)步,之后两个链表同时前进,每次一步,相遇的第一点即为两个链表相交的第一个点。
带环链表是否相交:
1:先判断链表是否带环
链表是否带环,可以采用快慢指针法,用两个指针指向链表的头结点,一个指针一次向后走一个位置,另一个指针向后走两个位置,这样如果两个指针如果相遇,这样就能说该链表带环,如果当快指针或者快指针的next为NULL时,还没有相遇。哪么就说明该链表不带环。
接下来判断带环链表的相交问题:
1:如果两个链表一个带环 ,一个不带环,则一定不相交
2:两个链表都带环
a:不相交
b:环外相交
c:环内相交
这种情况下只需要在判断在是否带环的过程中两个链表快慢指针的相遇点是否在另外一个链表中就可以,在就是相交。
在一个就是找入口点,在确定两个带环链表确实相交的情况下,通过上述求入口点的办法分别找到两个链表在环的入口点,相同就是环外相交,不相同就是环内相交。
还有一个问题就是为什么快慢指针一定是快指针走两步而不是三步或者更多,这个问题单独写一篇博客解释,。。
比较好的方法有两个:
一、将其中一个链表首尾相连,检测另外一个链表是否存在环,如果存在,则两个链表相交,而检测出来的依赖环入口即为相交的第一个点。
二、如果两个链表相交,那个两个链表从相交点到链表结束都是相同的节点,我们可以先遍历一个链表,直到尾部,再遍历另外一个链表,如果也可以走到同样的结尾点,则两个链表相交。
这时我们记下两个链表length,再遍历一次,长链表节点先出发前进(lengthMax-lengthMin)步,之后两个链表同时前进,每次一步,相遇的第一点即为两个链表相交的第一个点。
bool have_point(pList pplist1, pList pplist2)//不带环链表是否相交 { if (pplist1 == NULL || pplist2 == NULL) { return false; } else { pList cur1 = NULL; pList cur2 = NULL; while (pplist1) { cur1 = pplist1; pplist1 = pplist1->next; } while (pplist2) { cur2 = pplist2; pplist2 = pplist2->next; } if (cur1 == cur2) { return true; } else { return false; } } }
带环链表是否相交:
1:先判断链表是否带环
链表是否带环,可以采用快慢指针法,用两个指针指向链表的头结点,一个指针一次向后走一个位置,另一个指针向后走两个位置,这样如果两个指针如果相遇,这样就能说该链表带环,如果当快指针或者快指针的next为NULL时,还没有相遇。哪么就说明该链表不带环。
pList IsExitsLoop(pList pplist)//判断链表是否带环 { pList fast = pplist; pList slow = pplist; if (pplist == NULL || pplist->next == NULL) { return NULL; } else { while (slow && slow->next) { fast = fast->next->next; slow = slow->next; if (fast == slow) { break; } } return slow; } } pList FindLoopPort(pList pplist)//求环入口点 { pList fast = pplist; pList slow = pplist; if (pplist == NULL || pplist->next == NULL) { return NULL; } else { while (slow && slow->next) { fast = fast->next->next; slow = slow->next; if (fast == slow) break; } slow = pplist; while (slow != fast) { slow = slow->next; fast = fast->next; } return slow; } } size_t GetCircleLen(pList pplist)//求环长度, { pList cur = IsExitsLoop(pplist); pList p = cur->next; size_t count = 1; while (p != cur) { p = p->next; ++count; } return count; }
接下来判断带环链表的相交问题:
1:如果两个链表一个带环 ,一个不带环,则一定不相交
2:两个链表都带环
a:不相交
b:环外相交
c:环内相交
这种情况下只需要在判断在是否带环的过程中两个链表快慢指针的相遇点是否在另外一个链表中就可以,在就是相交。
在一个就是找入口点,在确定两个带环链表确实相交的情况下,通过上述求入口点的办法分别找到两个链表在环的入口点,相同就是环外相交,不相同就是环内相交。
还有一个问题就是为什么快慢指针一定是快指针走两步而不是三步或者更多,这个问题单独写一篇博客解释,。。
相关文章推荐
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 编程之美--编程判断两个链表是否相交
- 编程之美3.6——编程判断两个链表是否相交
- 链表面试题:判断两个链表是否相交
- 编程之美-判断两个链表是否相交方法整理
- 如何判断两个单向链表是否有相交,并找出交点
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断两个链表是否相交
- 判断两个链表是否相交 【微软面试100题 第七题】
- 编程判断两个链表是否相交
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 单链表逆序、判断单链表中是否存在环、两个不存在环的链表是否相交
- 判断链表有环没环及环的入口结点问题 和 判断两个链表是否相交
- 面试题----判断两个链表是否相交(可能带环)
- 判断两个链表是否相交
- 判断两个链表是否相交并找出交点
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 编程之美:编程判断两个链表是否相交
- 判断单链表是否存在环,判断两个链表是否相交