单链表判断是否相交
来源:互联网 发布:医用软件 编辑:程序博客网 时间:2024/05/18 19:44
判断单链表是否有环路可以参考:单链表判断环路及环路的入口
typedef int DataType;//节点中数据类型typedef struct ListNode//节点数据结构{ DataType data; struct ListNode *next;} ListNode;typedef struct CheckNoode/{ int flag; ListNode *p1; ListNode *p2;} CheckNoode;
1.判断两个链表是否相交,若相交,求交点。(假设不带环)
//判断是否相交bool CheckIsMeet(ListNode *plist1,ListNode *plist2){ while (plist1->next != NULL) { plist1 = plist1->next; } while (plist2->next != NULL) { plist2 = plist2->next; } if (plist1 == plist2) { return true; } else { return false; }}
//若相交,求交点ListNode *AnswerMeetNode(ListNode *plist1,ListNode *plist2){ int count1 = 0; int count2 = 0; int count = 0; ListNode *cur1 = plist1; ListNode *cur2 = plist2; while (cur1 != NULL) { count1++; cur1 = cur1->next; } while (cur2 != NULL) { count2++; cur2 = cur2->next; } count = count1 - count2; if (count > 0) { while (count--) { plist1 = plist1->next; } } else { count = -count; while (count--) { plist2 = plist2->next; } } while (plist1 != plist2) { plist1 = plist1->next; plist2 = plist2->next; } return plist1;}
void Test1(){ ListNode *plist1 = NULL; ListNode *plist2 = NULL; bool flag = true;if (flag) { printf("相交!\n"); printf("交点为:%d\n",AnswerMeetNode(plist1,plist2)->data); } else { printf("不想交!\n"); }}
2.判断两个链表是否相交,若相交,求交点。(假设可能带环)
1).两个都不带环
有可能相交,有可能不相交
2).一个带环一个不带环,必定不相交。
3).两个都带环
不相交
相交:交点不在环上;交点在环上
//判断两个链表是否相交,若相交,求交点.(假设链表可能带环)CheckNoode CheckIsMeetTop(ListNode *plist1, ListNode *plist2){ ListNode *tmp1 = NULL; ListNode *tmp2 = NULL; CheckNoode ret = { 0, NULL, NULL }; tmp1 = IsCycle(plist1); tmp2 = IsCycle(plist2); if ((tmp1 == NULL) && (tmp2 == NULL)) { //都不带环 tmp1 = plist1; tmp2 = plist2; while (tmp1->next != NULL) { tmp1 = tmp1->next; } while (tmp2->next != NULL) { tmp2 = tmp2->next; } if (tmp1 == tmp2) { //相交 ret.plist1 = AnswerMeetNode(plist1, plist2); ret.flag = 1; return ret; } else { //不相交 ret.flag = 1; return ret; } } else if ((tmp1 != NULL) && (tmp2 != NULL)) { //两者都带环 ListNode *tmp = tmp1->next; while ((tmp != tmp2) && (tmp != tmp1)) { tmp = tmp->next; } if (tmp == tmp2) { //相交 tmp1 = GetCycleEnter(plist1,tmp1); tmp2 = GetCycleEnter(plist2,tmp2); if (tmp1 == tmp2) { //交点在链上 int count1 = 0; int count2 = 0; int count = 0; ListNode *cur1 = plist1; ListNode *cur2 = plist2; while (cur1 != tmp1) { count1++; cur1 = cur1->next; } while (cur2 != tmp1) { count2++; cur2 = cur2->next; } count = count1 - count2; if (count > 0) { while (count--) { plist1 = plist1->next; } } else { count = -count; while (count--) { plist2 = plist2->next; } } while (plist1 != plist2) { plist1 = plist1->next; plist2 = plist2->next; } ret.plist1 = plist1; ret.flag = 3; return ret; } else { //两个交点都在环上 ret.plist1 = tmp1; ret.plist2 = tmp2; ret.flag = 3; return ret; } } else { //不相交 ret.flag = 3; return ret; } } else { //一个带环,一个不带环。必不相交 ret.flag = 2; return ret; }}
参考
阅读全文
0 0
- 单链表判断是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断两个单链表是否相交
- 判断单链表是否存在环,判断两单链表是否相交
- 判断单链表是否存在环 && 判断两链表是否相交
- 【链表】判断两个单链表是否相交
- PopupWindow
- PopupWindow的使用
- 高速缓存DNS
- Android USB 设备如何区分是打印机还是U盘
- Spring Cloud Eureka 增加权限认证
- 单链表判断是否相交
- JavaScript——组合使用构造函数模式和原型模式
- project Eulert 学习笔记 之 problem 22
- Ransac算法简介
- nova的pci 设备白名单
- 显卡工作原理
- 【AJAX】 jQuery应用之post提交
- maven的资源过滤
- MFC-移动无边框窗口