常见链表面试题之判断链表是否相交,并求交点
2016-05-20 15:36
211 查看
给定我们两个链表,在这里,我们先讨论单链表不带环的情况,我们该怎么判断它们是否相交?并求出其交点呢。
首先我们来分析一下两个链表相交都有哪几种情况。第一种就是Y型,它们从某一个节点相交,第二种是V型,它们直到尾节点才相交。下面两幅图分别对应两种情况。
1.Y型相交
2. V型相交
其实不难发现,如果两个链表相交的话,它们的尾节点肯定是相同的。所以如果要判断两个链表是否相交,我们可以遍历两个链表,看它们的尾节点是否相等,相等就能判定其相交。isCross函数,如果相交返回1,否则返回0.
要求其交点的话(第一个交点),我们的思路应该很明显,就是找到其中第一个相等的节点,便是他们的第一个交点。
但此时就要考虑怎么进行节点的比较了,因为有Y型和V型,我们不能直接从第一个节点进行遍历比较,所以应该再写一个length函数用来求链表的长度,然后让长的链表先走,当走到一样长的地方开始进行比较,找到相等的节点就返回这个节点。
length函数:
GetCrossNode求交点函数:
首先我们来分析一下两个链表相交都有哪几种情况。第一种就是Y型,它们从某一个节点相交,第二种是V型,它们直到尾节点才相交。下面两幅图分别对应两种情况。
1.Y型相交
2. V型相交
其实不难发现,如果两个链表相交的话,它们的尾节点肯定是相同的。所以如果要判断两个链表是否相交,我们可以遍历两个链表,看它们的尾节点是否相等,相等就能判定其相交。isCross函数,如果相交返回1,否则返回0.
int isCross(PNode pHead1, PNode pHead2) { PNode pnode1 = pHead1; PNode pnode2 = pHead2; if (pHead1 != NULL && pHead2 != NULL) { while (pnode1->pnext != NULL) { pnode1 = pnode1->pnext; } while (pnode2->pnext != NULL) { pnode2 = pnode2->pnext; } if (pnode1 == pnode2) //判断尾节点是否相等 { return 1; } } return 0; }
要求其交点的话(第一个交点),我们的思路应该很明显,就是找到其中第一个相等的节点,便是他们的第一个交点。
但此时就要考虑怎么进行节点的比较了,因为有Y型和V型,我们不能直接从第一个节点进行遍历比较,所以应该再写一个length函数用来求链表的长度,然后让长的链表先走,当走到一样长的地方开始进行比较,找到相等的节点就返回这个节点。
length函数:
int length(PNode pHead) { PNode pnode = pHead; int len = 0; if (pHead == NULL) { return 0; } while (pnode) { len++; pnode = pnode->pnext; } return len; }
GetCrossNode求交点函数:
PNode GetCrossNode(PNode pHead1, PNode pHead2) { PNode pnode1 = pHead1; PNode pnode2 = pHead2; int len1 = length(pHead1); int len2 = length(pHead2); int step = len1 - len2; if (0 == isCross(pHead1, pHead2) || pHead1 == NULL || pHead2 == NULL) { return NULL; } if (step >= 0) { while (step--) { pnode1 = pnode1->pnext; } while (pnode1) { if (pnode1 == pnode2) { return pnode1; } pnode1 = pnode1->pnext; pnode2 = pnode2->pnext; } } else { step = 0 - step; while (step--) { pnode2 = pnode2->pnext; } while (pnode2) { if (pnode1 == pnode2) { return pnode1; } pnode1 = pnode1->pnext; pnode2 = pnode2->pnext; } } return NULL; }
相关文章推荐
- Java程序员一定知道的优秀第三方库
- 程序员的表白神器“520”大声喊出来
- 程序员最常见的谎话,你说了哪一句?
- 码农只能干到30岁的说法可信吗?
- iOS 面试题整理(带答案)二
- 面试基础(一)-字符串函数
- Stay教你程序员泡妞攻略
- 码农只能干到30岁的新理由
- 《招一个靠谱的移动开发》iOS面试题及详解(下篇)
- 《招一个靠谱的移动开发》iOS面试题及详解(下篇)
- 程序员的表白情书“520”大声喊出来
- 《招一个靠谱的移动开发》iOS面试题及详解(上篇)
- 《招一个靠谱的移动开发》iOS面试题及详解(上篇)
- 腾讯 5.20 2017暑期软件开发实习生笔试+面试
- 常见的单链表面试题
- 剑指Offer----面试题六:重建二叉树
- 父域与子域的帐户是否可以相互登陆
- 优秀程序员的十个习惯
- 面试必备 - 经典冒泡排序Java
- BAT及各大互联网公司2014前端笔试面试题:HTML/CSS篇