无头单链表面试题(3)
来源:互联网 发布:阿里云华南 编辑:程序博客网 时间:2024/05/24 06:28
题目:判断判断链表是否相交,若相交返回交点(假设链表可能带环)
分析:根据题目画图,由题目可分解3中情况:
1.带环相交,交点不在环上
2.带环相交,交点在环上
3.不相交
设计函数:1.先判断两条链表是否相交
2.若相交,找出交点并把交点返回;
若不相交,返回NULL,结束函数。
3.找交点(可以分装一个函数):
(1)创建四个Node指针,L1指向链表1的头,L2指向链表2的头,pos1指向链表1的环入口点,pos2指向链表2的环入口点;
(2)如果在环外相交:将pos2->next=L2;然后调用判环函数IsCircle; 创建一个Node指针C接收C=IsCircle(p1);最后返回C。
(3)如果不在环外相交则就是再环上相交,返回环上的一个结点位置就好。
程序代码:
Node*JudgeCrossCircle(Node*list1,Node*list2) //14.判断判断链表是否相交,若相交返回交点(假设链表可能带环){if (list1 == NULL)return NULL;if (list2 == NULL)return NULL;Node*Cross(Node*p1,Node*p2,Node*plist1,Node*plist2); //函数声明,下面求交点要用Node*p1 = list1;Node*p2 = list2;Node*plist1 = IsCircle(list1); //若list1带环,plist1是其入口点Node*plist2 = IsCircle(list2); //若list2带环,plist2是其入口点Node*temp = plist1;while (plist1!=temp->next){if (temp == plist2) //链表list1与链表list2相交{Node*Meet = Cross(p1,p2,plist1,plist2); //求相遇点位置return Meet;}temp = temp->next;}if (plist1 == plist2) //链表list1与链表list2相交{Node*Meet = Cross(p1,p2,plist1,plist2); //求相遇点位置return Meet;}return NULL;}Node*Cross(Node*p1, Node*p2,Node*plist1,Node*plist2) //求相遇点位置{Node*L1 = p1; //链表1的头Node*L2 = p2; //链表2的头Node*pos1 = plist1; //链表1的环入口点Node*pos2 = plist2; //链表2的环入口点Node*C = NULL;if (pos1 ==pos2) //在环外相交{plist2->next =p2; //将p2的尾结点与头结点相接C = IsCircle(p1);return C;}else //在环上相交{C = plist1->next; //将环上的一个点当做其交点return C;}}
测试
int main(){Node*mylist1;Init(&mylist1);Pushback(&mylist1, 1);Pushback(&mylist1, 2);Pushback(&mylist1, 3);Pushback(&mylist1, 4);Pushback(&mylist1, 5);Pushback(&mylist1, 6);Pushback(&mylist1, 7);Pushback(&mylist1, 8);Node*ret = Find(mylist1, 8);ret->next = Find(mylist1, 5);Node*mylist2;Init(&mylist2);Pushback(&mylist2, 0);Pushback(&mylist2, 11);Pushback(&mylist2, 12);Pushback(&mylist2, 13);Node*temp = Find(mylist2, 13);temp->next = Find(mylist1, 6); //换Find的的第二个参数,可测试三种情况Node*Cross = JudgeCrossCircle(mylist1, mylist2);/*cout << Cross->data << endl;*/ //当不相交的时候,屏蔽该行system("pause");return 0;}(1)环外相交
(2)换上相交
(3)不相交
阅读全文
1 0
- 无头单链表面试题(3)
- 无头单链表面试题
- 无头单链表面试题(2)
- 链表面试题(一)
- 链表面试题(一)
- 链表面试题(二)
- 链表面试题小结(待完成)
- 链表面试题总结(一)
- 单链表面试题汇总(1)
- 链表面试题总结(一)
- 链表面试题总结(二)
- 单链表面试题(2)
- 单链表面试题(一)
- 链表面试题(八)---约瑟夫环
- 单链表面试题(综合)
- 【C】单链表面试题(进阶)
- 单链表面试题(一)
- 链表面试题代码总结(java)
- 什么是BFC?
- SSM框架之SpringAOP快速搭建
- android 使用websocket 实现简单的聊天。
- NVIDIA DIGITS 安装
- 求两个序列的最长公共子序列
- 无头单链表面试题(3)
- iOS开发—自定义NSOperation子类下载图片
- Java手机验证码的实现
- 信息学奥赛一本通(C++版) 第三部分 数据结构 第四章 图论算法
- 08-图7 公路村村通(30 分)
- java运算符
- Java基础——第一个Java程序
- 1019. 数字黑洞 (20)
- Chrome 控制台console的用法