博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两个单向链表的第一个公共节点
阅读量:6958 次
发布时间:2019-06-27

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

参考

http://blog.163.com/clevertanglei900@126/blog/static/1113522592011914148467/

问题:

两个单向链表,可能存在公共节点。如何判断是否存在公共节点,并找出它们的第一个公共结点。

思想:

1. 如果两个链表相交,则从相交点开始,后面的节点都相同,即最后一个节点肯定相同;

2. 从头到尾遍历两个链表,并记录链表长度,当二者的尾节点不同,则二者肯定不相交;
3. 尾节点相同,如果A长为LA,B为LB,如果LA>LB,则A前LA-LB个先跳过,

   然后二者一起向后遍历,直到遇到相同的节点;LA<LB类似处理
   因为第一个公共节点距起始节点的距离start_a满足: LA - start_a == LB - start_b。

 

const ListNode* FirstCommonNode(const ListNode* listA, const ListNode* listB){    if(listA==NULL || listB==NULL) return NULL;    int LA=1,LB=1;//A,B链表长度    const ListNode* curA = listA, *curB = listB;    //二表节点首地址    while(curA->next)//求A尾节点,LA长度    {++LA; curA = curA->next;}    while(curB->next)//求B尾节点,LB长度    {++LB; curB = curB->next;}    if(curA != curB) return NULL;//尾节点不相同,则没有相交    //重新获取ab的首地址    curA = listA;curB = listB;    if(LA > LB)//    {        for(int i=0; i
next;//A移到公共节点 } else { for(int i=0; i
next;//B移到公共节点 } while(curA && curA!=curB) { curA = curA->next;//不相等就往下走 curB = curB->next; } return curA;//返回首个相同的节点} 简单测试代码:void CreateJointList(const string* strA, int sizeA,const string* strB ,int sizeB, const string* strC,int sizeC,ListNode** listA,ListNode** listB)//创建两个相交的链表{ ListNode* rootA = new ListNode(strA[0]); //数组的第一个元素根节点 ListNode* rootB = new ListNode(strB[0]); *listA = rootA; *listB = rootB; //连接 for(int i=1; i
next = new ListNode(strA[i]); rootA = rootA->next; } for(int i=1; i
next = new ListNode(strB[i]); rootB = rootB->next; } ListNode* tmp = new ListNode(strC[0]); rootA->next = tmp; rootB->next = tmp; for(int i=1; i
next = new ListNode(strC[i]); tmp = tmp->next; }} ListNode *headA,*headB; const int SizeA = 6,SizeB = 7,SizeC = 5; const string A[SizeA] = {
"I","am","an","List","named","A"}; //常量数组 const string B[SizeB] = {
"I","am","also","an","List","named","B"}; const string C[SizeC] = {
"this","part","is","in","Comman"}; //创建交叉链表 CreateJointList(A,SizeA,B,SizeB,C,SizeC,&headA,&headB); //打印A PrintList(headA); PrintList(headB); //找到交点 const ListNode *node = FirstCommonNode(headA, headB); if(node != NULL) cout<<"\nCommon Node : \t"<
value<

 

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

你可能感兴趣的文章
eclipse导入第三方jar包进入web项目的方法
查看>>
发展至今的机器学习到底对我们的就业和社会产生了哪些影响?
查看>>
2017四川电商年度盛典,千机网论道企业变革
查看>>
Ubuntu 16.04安装QQ(不一定成功)
查看>>
四种方法教你破解Linux(CentOS7.4)系统的root密码
查看>>
阿里云郑晓:浅谈GPU虚拟化技术(第一章)
查看>>
用数据分析赢得卓越业务
查看>>
java直接执行jar包
查看>>
Java中的正则表达式
查看>>
Database Visualization using Metabase Part 1 - Install Metabase on Ubuntu 16.04
查看>>
区块链应用 | 2018年,区块链将有这五大新发展
查看>>
【深度荐读】人脑产生意识,可能是因为量子纠缠
查看>>
亚信安全:2017年勒索软件与商业邮件欺骗将继续蔓延
查看>>
每个.NET 开发人员应该下载的十个必备工具
查看>>
为WPF程序中的数据(Model)添加编辑功能
查看>>
eclipse开发web应用程序步骤(图解)
查看>>
GitHub上不错的Android开源项目(三)
查看>>
Osmocom-bb系统编译
查看>>
对象的思维
查看>>
spring-注入map集合
查看>>