博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
推断两条单链表是否相交
阅读量:6148 次
发布时间:2019-06-21

本文共 2807 字,大约阅读时间需要 9 分钟。

        算法中常常会推断两条单链表是否相交,尽管算法简单,但也值得说一下。

代码中有详尽凝视。 Show you the code !

#undef UNICODE#include 
#include
#include
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; } }

        这就是编程之美。同样的问题採用不同的方法,效果全然不同。

转载地址:http://gnmya.baihongyu.com/

你可能感兴趣的文章
智能语音控制中心 - 树莓派、Nanopi、Orangepi语音识别控制
查看>>
利用SCVMM 2012 R2来管理Azure虚拟机
查看>>
在U盘上安装ESXi 4.1.0
查看>>
北信源内网安全管理管理系统
查看>>
邮件营销整体解决方案
查看>>
借助工具Profwiz进行加域及账户配置文件迁移
查看>>
09-OSPF故障排查总结
查看>>
ORACLE 10g 下载地址列表
查看>>
使用ManageEngine NetFlow Analyzer监控netflow
查看>>
Struts2 漏洞彻底解决办法
查看>>
暖心的回复
查看>>
6月又过去一大半了。
查看>>
分布式文件系统MogileFS介绍
查看>>
使用Python实现Hadoop MapReduce程序
查看>>
python内置函数2-classmethod()
查看>>
python内置函数5-getattr()
查看>>
win2008重新生成SID
查看>>
通过PXE部署系统时报错 0xc000000f
查看>>
修改计算机MAC地址(win7)
查看>>
linux下如何挂接(mount)光盘镜像文件、移动硬盘、U盘、Windows网络共享和NFS网络共享...
查看>>