6. 微软面试题:判断俩个链表是否相交
2014-03-07 22:50
405 查看
链表假设是单链表,
这题需要找到相交的特征,相交后,最后一个节点肯定相同,所以,如果相同则是相交,否则不相交。
下面看看实现:
输出结果如下:
L1, L2 list is insection
谢谢有点文化的小流氓 网友指出上面有环没法处理,特意加入处理环的逻辑。
再判断相交之前,先判断两个链表是否有环,都没有环,则是上面的实现,都有环,则要判断是否是同一个环,否则不相交。
实现如下:
这题需要找到相交的特征,相交后,最后一个节点肯定相同,所以,如果相同则是相交,否则不相交。
下面看看实现:
#include<iostream> using namespace std; struct LNode{ LNode(int _d = 0):data(_d),next(NULL) {} int data; LNode* next; }; bool findInsecNode(LNode* l1, LNode* l2) { if(l1 == NULL) return false; if(l2 == NULL) return false; LNode* pl1 = l1; LNode* pl2 = l2; while(pl1->next != NULL) pl1 = pl1->next; while(pl2->next != NULL) pl2 = pl2->next; if(pl1 == pl2) return true; else return false; } int main() { LNode* L1 = NULL; LNode* L2 = NULL; LNode n1(1); LNode n2(2); LNode n3(3); LNode n4(4); LNode n5(5); LNode n6(6); L1 = &n1; L2 = &n2; L1->next = &n3; L2->next = &n4; L1->next->next = &n5; L2->next->next = &n5; L1->next->next->next = &n6; L2->next->next->next = &n6; if(findInsecNode(L1, L2)) cout << "L1, L2 list is insection" << endl; else cout << "L1, L2 list is not insection" << endl; return 0; }
输出结果如下:
L1, L2 list is insection
谢谢有点文化的小流氓 网友指出上面有环没法处理,特意加入处理环的逻辑。
再判断相交之前,先判断两个链表是否有环,都没有环,则是上面的实现,都有环,则要判断是否是同一个环,否则不相交。
实现如下:
#include<iostream> using namespace std; struct LNode{ LNode(int _d = 0):data(_d),next(NULL) {} int data; LNode* next; }; bool bring(LNode* l) { if(l == NULL || l->next == NULL) return false; LNode* p1 = l; LNode* p2 = l->next; while(p2 != NULL && p1 != p2) { p1 = p1->next; if(p2->next != NULL) p2 = p2->next->next; else p2 = p2->next; } if(p2 != NULL) return true; else return false; } bool findInsecNode(LNode* l1, LNode* l2) { if(l1 == NULL) return false; if(l2 == NULL) return false; LNode* pl1 = l1; LNode* pl2 = l2; if(!bring(l1)&& !bring(l2)) { while(pl1->next != NULL) pl1 = pl1->next; while(pl2->next != NULL) pl2 = pl2->next; if(pl1 == pl2) return true; else return false; } else if(bring(l1) && bring(l2)) { LNode* pll1 = pl1; pl1 = pl1->next; pll1 = pll1->next->next; while(pll1 != pl1) { pl1 = pl1->next; pll1 = pll1->next->next; } LNode* pll2 = pl2; pl2 = pl2->next; pll2 = pll2->next->next; while(pll2 != pl2) { pl2 = pl2->next; pll2 = pll2->next->next; } if(pl1 == pl2) return true; LNode* p = pl1; p = p->next; while(p != pl1) { if(p == pl2) return true; p = p->next; } } else return false; } int main() { LNode* L1 = NULL; LNode* L2 = NULL; LNode n1(1); LNode n2(2); LNode n3(3); LNode n4(4); LNode n5(5); LNode n6(6); L1 = &n1; L2 = &n2; L1->next = &n3; L2->next = &n4; L1->next->next = &n5; L2->next->next = &n5; L1->next->next->next = &n6; L2->next->next->next = &n6; L1->next->next->next->next = &n5; if(findInsecNode(L1, L2)) cout << "L1, L2 list is insection" << endl; else cout << "L1, L2 list is not insection" << endl; return 0; }
相关文章推荐
- 7. 微软亚院之编程判断俩个链表是否相交
- 7 微软亚院之编程判断俩个链表是否相交,相交的首节点
- 微软算法100道题------判断俩个链表是否相交
- 微软100题第7题(判断俩个链表是否相交)
- 微软面试100道之7 判断俩个链表是否相交
- 7、微软亚院之编程判断俩个链表是否相交
- (微软面试100题)判断两个链表是否相交
- 【从零单排之微软面试100题系列】07之判断两个链表是否相交
- 面试题----判断两个链表是否相交(可能带环)
- 常见链表面试题之判断链表是否相交,并求交点
- 链表面试题(十二)---判断两个都不带环的链表是否相交
- 7.微软亚院之编程判断俩个链表是否相交(链表)
- 编程判断俩个链表是否相交
- <仅是自己做笔记。。。系列-6>判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。
- 判断俩个链表是否相交
- 微软100题(7) 判断两链表是否相交
- 算法习题8:判断俩个链表是否相交
- 7.微软亚院之编程判断俩个链表是否相交(为了简化问题,我们假设俩个链表均不带环)
- 微软亚院之编程判断俩个链表是否相交
- 链表面试题:判断两个链表是否相交