无环单链表判相交练习
来源:互联网 发布:光猫 连接端口 编辑:程序博客网 时间:2024/05/21 14:41
现在有两个无环单链表,若两个链表的长度分别为m和n,请设计一个时间复杂度为O(n + m),额外空间复杂度为O(1)的算法,判断这两个链表是否相交。
给定两个链表的头结点headA和headB,请返回一个bool值,代表这两个链表是否相交。保证两个链表长度小于等于500。
方法非常简单,如果不考虑返回入口节点可以直接判断两个链表最后一个节点是否相等,如果相等则相交,不相等不相交,如果要返回入口节点,则首先从头开始遍历,当一个链表到达末尾时,另一个链表继续遍历,并从头部开始遍历,如果遍历到尾部,之后这个头部节点的位置和端一点链表的头部位置同时开始遍历,如果遍历到相同节点则为入口节点,遍历到尾部还不出现相同节点,则不相交。
如果不考虑空间复杂度可以之间利用哈希表,将一个链表的节点放入哈希表,之后查找另一个链表节点是否在哈希表中即可
/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {}};*/class CheckIntersect {public: bool chkIntersect(ListNode* headA, ListNode* headB) { if(!headA||!headB) return false; ListNode* preheadA=new ListNode(0); ListNode* preheadB=new ListNode(0); preheadA->next=headA; preheadB->next=headB; ListNode* Abegin=preheadA; ListNode* Bbegin=preheadB; while(Abegin&&Bbegin) { Abegin=Abegin->next; Bbegin=Bbegin->next; } if(Abegin) { Bbegin=preheadB; ListNode* tempAbegin=Abegin; Abegin=preheadA; while(tempAbegin) { tempAbegin=tempAbegin->next; Abegin=Abegin->next; } } else if(Bbegin) { Abegin=preheadA; ListNode* tempBbegin=Bbegin; Bbegin=preheadB; while(tempBbegin) { tempBbegin=tempBbegin->next; Bbegin=Bbegin->next; } } else { Abegin=preheadA; Bbegin=preheadB; } while(Abegin&&Bbegin) { if(Abegin==Bbegin) return true; Abegin=Abegin->next; Bbegin=Bbegin->next; } return false; }};
0 0
- 无环单链表判相交练习
- 有环单链表相交判断练习
- 单链表相交判断练习
- 无环单链表判相交
- 链表18:无环单链表判相交
- 练习:判断两个无环链表是否相交--C实现
- 复杂链表的复制、链表判环、无环单链表判相交
- 矩形相交
- 【叉乘判相交】
- 相交线
- 线段相交
- 线段相交
- 线段相交
- 线段相交
- 规范相交
- 判断相交
- 线段相交
- 带环相交
- jenkins邮件插件中的内容参数设置
- C primer plus 第四章字符串和格式化输入输出 个人编程练习
- mysql 表的定义和字段的查看
- linux中统计字节数、字数、行数命令wc用法详解
- 设置代理和取消
- 无环单链表判相交练习
- 事件代理举例
- java--遇到NoSuchMethodError通用解决思路
- PHP设计模式—六大原则
- c++如何将string 转换为char*
- JSP中include的两种用法
- 解决MVC添加区域(Area)报错failed to render template because of the following errors
- 轻松搞定面试中的二叉树题目
- 矩阵快速幂(模板+例题)