求链表相交时的交点(C语言)
2016-04-14 20:06
537 查看
//链表相交时的交点 PSListNode IntersectionNode(PSListNode pL1, PSListNode pL2) { int count1 = 0; int count2 = 0; PSListNode PSList1 = pL1; PSListNode PSList2 = pL2; PSListNode pMeetNode1 = HasCycle(pL1); PSListNode pMeetNode2 = HasCycle(pL2); if ((NULL == pL1) || (NULL == pL2)) { return NULL; } else { //先求每个链表的长度 //两个链表都没环 if ((NULL == pMeetNode1) && (NULL == pMeetNode2)) { while (NULL != PSList1) { PSList1 = PSList1->pNextNode; count1++; } while (NULL != PSList2) { PSList2 = PSList2->pNextNode; count2++; } } //两个链表都有环 else if ((NULL != pMeetNode1) && (NULL != pMeetNode2)) { PSListNode pInNode1 = FindEnterNode(PSList1, pMeetNode1); PSListNode pInNode2 = FindEnterNode(PSList2, pMeetNode2); //先计算头指针到环入口结点的长度,再计算环的长度 while (PSList1 != pInNode1) { PSList1 = PSList1->pNextNode; count1++; } while (PSList1->pNextNode != PSList1) { PSList1 = PSList1->pNextNode; count1++; } count1++;; while (PSList2 != pInNode2) { PSList2 = PSList2->pNextNode; count2++; } while (PSList2->pNextNode != PSList1) { PSList2 = PSList2->pNextNode; count2++; } count2++;; } //一个有环,一个没环,不会相交 else { return NULL; } //让长度长的链表的头指针先走它长于另一个链表的结点数 //在计算链表长度时修改了这两个指针的值,在这儿需要把它们改回来 PSList1 = pL1; PSList2 = pL2; if (count1 > count2) { int temp = count1 - count2; while (0 == temp--) { PSList1 = PSList1->pNextNode; } } else { int temp = count2 - count1; while (0 == temp--) { PSList2 = PSList2->pNextNode; } } //此时,让两个链表的头指针同时移动,直到它们相等就找到了交点 //因为题目是找交点,那么交点就存在,所以这儿不用怕死循环 while (1) { if (PSList1 = PSList2) { break; } PSList1 = PSList1->pNextNode; PSList2 = PSList2->pNextNode; } return PSList1; } }
相关文章推荐
- 判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】(C语言)
- 判断两个链表是否相交,若相交,求交点。(假设链表不带环)(C语言)
- 判断单链表是否带环?若带环,求环的长度?求环的入口点?(C语言)
- 查找单链表的倒数第k个节点,要求只能遍历一次链表(C语言)
- c++第3次作业
- 查找单链表的中间节点,要求只能遍历一次链表(C语言)
- 合并两个有序链表,合并后依然有序(C语言)
- C++中operator的主要用法
- 单链表排序(冒泡排序)(C语言)
- leetcode21题 题解 翻译 C语言版 Python版
- c++ json封装---解析
- c++第二次作业
- ActiveX(MFC)控件——添加接口及WEB调用
- C++ string类的实现
- int、long、long long取值范围
- C++创建文件夹
- VC 字符串转化和分割
- C++打印日志功能设计
- C++基本语法-----template
- 逆置/反转单链表(C语言)