1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】
2017-07-16 11:35
453 查看
//链表定义 typedef struct Node { Node(const int& value) : m_value(value) , m_pNext(NULL) {} int m_value; Node* m_pNext; }Node, *pNode; //判断链表是否相交 不带环 /* 算法思想:因为相交之后的部分长度是相等的,所以我们让长链表的长度减去 短链表的长度。然后让长链表开始走过相差的长度,与短链表同时向 后走。若指针相等,则链表相交;所走到NULL 则链表不相交 */ int length(pNode pHead) { if (pHead == NULL) return 0; pNode node = pHead; int count = 0; while (node) { count++; node = node->m_pNext; } return count; } pair<pNode, bool> isIntersect(pNode pHead1,pNode pHead2) { assert(pHead1&&pHead2); pNode node1 = pHead1; pNode node2 = pHead2; int num = length(node1) - length(node2); if (num > 0) { while (num--&&node1) { node1 = node1->m_pNext; } } else if (num < 0) { int temp = abs(num); while (temp--&&node2) { node2 = node2->m_pNext; } } while (node1&&node2&&node1!=node2) { node1 = node1->m_pNext; node2 = node2->m_pNext; } if (node1&&node2&&node1 == node2) return make_pair(node1, true); return make_pair(node1, false); } //链表是否相交 带环 pair<pNode, bool> MeetingPointInCirlec(pNode pHead1, pNode pHead2) { assert(pHead1&&pHead2); if (!IsExistsLoop(pHead1).second &&!IsExistsLoop(pHead2).second)//两个链表都不带环 return isIntersect(pHead1, pHead2); if ((IsExistsLoop(pHead1).second&&!IsExistsLoop(pHead2).second) || (!IsExistsLoop(pHead1).second && IsExistsLoop(pHead2).second)) //pHead1带环并且pHead2不带环或者pHead1不带环pHead2带环 return make_pair(pHead1, false); //说明两个链表都带环,在其中一个链表的环内选取一个结点,遍历另 //一个链表如果有这个结点说明相交 pNode node = IsExistsLoop(pHead1).first; pNode node2 = pHead2; while (node->m_pNext!=node) { if (node->m_value == node2->m_value) { //相交环的入口点即是交点 pNode temp = FindLoopPort(pHead1);//求环的入口点 return make_pair(temp, true); } node = node->m_pNext; node2 = node2->m_pNext; } return make_pair(node, false); }
相关文章推荐
- 判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】(C语言)
- 判断两个链表是否相交,若相交,求交点。(假设链表可能带环)
- 链表--1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)
- 判断两个链表是否相交,若相交,求交点:1.不带环。2.有可能带环
- 判断两个链表是否相交?若相交,求交点(假设链表带环)
- 判断两个链表是否相交,若相交,求交点。(假设链表带环、不带环)
- 判断两个链表是否相交,若相交,求交点。(假设链表不带环)(C语言)
- <笔试><面试>C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)
- 判断两个链表是否相交,若相交,求交点,若带环呢/fork继承问题
- <笔试><面试>C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)
- 如何判断两个链表是否相交。(假设链表带环、不带环)
- ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)
- 每日一刷——1.判断两个链表是否相交,若相交求交点(链表不带环&带环)2.fork()问题
- 判断两链表是否相交,若相交求交点(链表可能带环)
- 判断两个链表是否相交,若相交,求交点,考虑带环情况实现代码
- 求两个链表是否相交,若相交,求交点(链表可能带环)
- 面试题----判断两个链表是否相交(可能带环)
- 链表面试题(十二)---判断两个都不带环的链表是否相交
- 题目:①判断一个单向链表是否有环,如果有环则找到环的入口节点。 ②判断两个单向链表是否相交,如果相交则找到交点节点。
- 编程之美-编程判断两个链表(可能含环)是否相交以及相交的第一个结点