判断两条单链表是否相交
来源:互联网 发布:linux 文件排序 编辑:程序博客网 时间:2024/06/06 00:54
算法中经常会判断两条单链表是否相交,虽然算法简单,但也值得说一下。代码中有详尽注释, Show you the code !
#undef UNICODE#include <iostream>#include <Windows.h>#include <cstring>using namespace std;typedef struct _SINGLE_LIST { _SINGLE_LIST *Next; char Tag;} SINGLE_LIST, *PSINGLE_LIST;void main(){ PSINGLE_LIST Entry = NULL; char TagIndex = 'A'; PSINGLE_LIST Head1 = (PSINGLE_LIST)malloc(sizeof(SINGLE_LIST)); Entry = Head1; Entry->Tag = TagIndex++; Entry->Next = NULL; for (int i = 0; i < 6; i++) { Entry->Next = (PSINGLE_LIST)malloc(sizeof(SINGLE_LIST)); Entry->Next->Tag = TagIndex++; Entry->Next->Next = NULL; Entry = Entry->Next; } PSINGLE_LIST Head2 = (PSINGLE_LIST)malloc(sizeof(SINGLE_LIST)); Entry = Head2; Entry->Tag = TagIndex++; Entry->Next = NULL; for (int i = 0; i < 3; i++) { Entry->Next = (PSINGLE_LIST)malloc(sizeof(SINGLE_LIST)); Entry->Next->Tag = TagIndex++; Entry->Next->Next = NULL; Entry = Entry->Next; } // 构造一个交点 Entry->Next = Head1->Next->Next->Next; // 下图即为此时两个链表的连接情况 // +--------------------------------------------+ // | A -> B -> C -> D -> E -> F -> G | // | ^ | // | | | // | H -> I -> J -> K | // +--------------------------------------------+ // 方法一: // 循环遍历第一个链表中的每一项,查看是否在第二个链表中,因为两个单链表相交 // 遍历其中任一链表,至少一个或多个项在第二个链表中。在最坏的情况下,将运算 // m*n 次。 算法如下: BOOL IsIntersect = FALSE; PSINGLE_LIST IntersectEntry = NULL; Entry = Head1; while (Entry != NULL) { PSINGLE_LIST Entry2 = Head2; while (Entry2) { if (Entry == Entry2) { IsIntersect = TRUE; IntersectEntry = Entry; goto Result; } Entry2 = Entry2->Next; } Entry = Entry->Next; }Result: if (IsIntersect) { //cout << "Intersect: " << "True. " << "Tag - " << IntersectEntry->Tag << endl; cout << "Intersect: " << "True." << endl; } else { cout << "Intersect: " << "False" << endl; } // 方法二: // 观察上图不难发现如果两个单链表相交,那么最后一个项必然相同。所以如果站在只判断单 // 链表是否相交的角度来看,算法其实可以更简单。两个链表各遍历一遍,找到最后一个项, // 检查是否相同。运算次数为 m+n。 算法如下: PSINGLE_LIST LastEntry1 = NULL; PSINGLE_LIST LastEntry2 = NULL; Entry = Head1; while (Entry != NULL) { Entry = Entry->Next; } LastEntry1 = Entry; Entry = Head2; while (Entry != NULL) { Entry = Entry->Next; } LastEntry2 = Entry; if (LastEntry1 == LastEntry2) { IsIntersect = TRUE; } if (IsIntersect) { //cout << "Intersect: " << "True. " << "Tag - " << IntersectEntry->Tag << endl; cout << "Intersect: " << "True." << endl; } else { cout << "Intersect: " << "False" << endl; }}
这就是编程之美,相同的问题采用不同的方法,效果完全不同。
133 0
- 判断两条单链表是否相交
- 判断俩个链表是否相交
- 判断俩链表是否相交
- 判断俩个链表是否相交
- 判断俩链表是否相交
- 判断矩形是否相交
- 判断俩个链表是否相交
- 判断这俩个链表是否相交
- 判断两链表是否相交
- 判断俩个链表是否相交
- 判断线段是否相交
- 判断俩单链表是否相交
- 判断两链表是否相交
- 判断无环链表是否相交
- 判断有环链表是否相交
- 判断两单链表是否相交
- 单链表判断是否相交
- 判断两线段是否相交
- java的学习记录7
- 陇南武都做人工流产的时间
- Oracle sql"NOT IN"语句优化,查询A表有、B表没有的数据
- arm汇编条件码
- oracle cmd 数据导入导出
- 判断两条单链表是否相交
- scala基础之控制结构
- 陇南武都做人流什么时间合适
- mac下的抓包工具Charles
- 陇南武都做人流多少时间
- VC++适合做什么
- 通过js选中单选按钮
- android帮助文档打开慢的三种解决方法
- SendMessage和PostMessage及Windows消息机制简介