求两个单向无环链表的第一个公共交点
2014-03-27 13:27
29 查看
题目描述:给定两个无环链表,长度分别为n和m,求它们的第一个交点。
分析:如果两个链表有公共节点,也就是说两个链表从某一点开始,它们的next指针都指向同一个节点,但由于是单
向链表,那么每个节点都只有一个next指针,所以从第一个公共节点开始,之后它们所有的节点都是重合的,那么它
们的拓扑形状就像Y字型。
既然这样,那么我们可以这样做,如果它们的尾节点相同,说明这两个链表是相交的。如果要求交点,我们有一个很
好的算法,先求出这两个链表的长度,假设分别为xlen和ylen,并且xlen>ylen,先在链表x上走xlen-ylen的长
度,然后两个链表剩余的部分长度就一样了,这样再同时扫描,直到走到同一个节点结束,时间复杂度为O(m+n)。
核心代码:
其实本题还有一个方法也比较可靠:我们知道如果两个链表相交必成Y字型,那么我们把其中一个链表首尾相连,然
后来检测另外一个链表是否存在环,如果存在,则说明相交,并且我们可以求出环的入口点即为链表相交的第一个节
点。相反,如果不存在环,那么说明这两个链表不相交。
分析:如果两个链表有公共节点,也就是说两个链表从某一点开始,它们的next指针都指向同一个节点,但由于是单
向链表,那么每个节点都只有一个next指针,所以从第一个公共节点开始,之后它们所有的节点都是重合的,那么它
们的拓扑形状就像Y字型。
既然这样,那么我们可以这样做,如果它们的尾节点相同,说明这两个链表是相交的。如果要求交点,我们有一个很
好的算法,先求出这两个链表的长度,假设分别为xlen和ylen,并且xlen>ylen,先在链表x上走xlen-ylen的长
度,然后两个链表剩余的部分长度就一样了,这样再同时扫描,直到走到同一个节点结束,时间复杂度为O(m+n)。
核心代码:
struct node { int val; node *next; }; node *head,*p,*q; void Init() { head = new node(); q = head; } void Insert(int x) { p = new node(); p->val = x; q->next = p; q = p; q->next = NULL; } int Length(int *t) { int len = 0; while(t) { len++; t = t->next; } return len; } node *Find(node* &x,node* &y) { int xlen = Length(x); int ylen = Length(y); node *Lx = x; node *Ly = y; if(xlen > ylen) { for(int i=1;i<=xlen-ylen;i++) Lx = Lx->next; } else { for(int i=1;i<=ylen-xlen;i++) Ly = Ly->next; } while(Lx && Ly) { if(Lx == Ly) return Lx; Lx = Lx->next; Ly = Ly->next; } return NULL; }
其实本题还有一个方法也比较可靠:我们知道如果两个链表相交必成Y字型,那么我们把其中一个链表首尾相连,然
后来检测另外一个链表是否存在环,如果存在,则说明相交,并且我们可以求出环的入口点即为链表相交的第一个节
点。相反,如果不存在环,那么说明这两个链表不相交。
相关文章推荐
- 两个单向链表相交,找到第一个公共节点
- 判断两个链表是否相交,及其第一个公共交点
- 面试题04:找出两个单向链表的第一个公共节点
- 两个单向链表的第一个公共节点
- 两个单向链表的第一个公共节点
- 两个单向链表,找出它们的第一个公共结点。
- 两个单向链表,找出它们的第一个公共结点
- 数据结构之链表面试题汇总(四)得到两个单链表相交的第一个交点、用O(1)的时间效率删除单向链表中的指定节点
- 找到两个单向链表的第一个公共节点
- 第六十二题(求两个单向链表的第一个公共节点)
- 两个单向链表,判断它们是否相交,若相交,找出它们的第一个公共的结点
- 找到两个单向链表的第一个公共节点
- 两个单向链表,找出它们的第一个公共结点。
- 找到两个单向链表的第一个公共节点
- 两个单向链表,找出它们的第一个公共结点
- 两个单向链表,找出它们的第一个公共结点
- 微软面试题:找到两个单向链表的第一个公共节点
- (剑指offer)两个单向链表,找出它们的第一个公共结点
- 两个单向链表,找出它们的第一个公共结点
- 两个链表的第一个公共结点