算法题:求两个单链表相交的第一个节点
目录
- 一、题目
- 思路
- 代码
- 二、总结
一、题目
#include <iostream>
#include <stack>
using namespace std;
//链表结点声明如下:
struct ListNode
{int m_nKey;ListNode * m_pNext;};//求两个单链表相交的第一个节点
ListNode* GetFirstCommonNode(ListNode * pHead1, ListNode * pHead2)
{}
思路1
对第一个链表遍历,计算长度len1,同时保存最后一个节点的地址。
对第二个链表遍历,计算长度len2,同时检查最后一个节点是否和第一个链表的最后一个节点相同,若不相同,不相交,结束。
两个链表均从头节点开始,假设len1大于len2,那么将第一个链表先遍历len1 - len2个节点,此时两个链表当前节点到第一个相交节点的距离就相等了,然后一起向后遍历,知道两个节点的地址相同。
时间复杂度,O(len1 + len2)。
代码
ListNode* GetFirstCommonNode(ListNode * pHead1, ListNode * pHead2)
{if (pHead1 == NULL || pHead2 == NULL)return NULL;int len1 = 1;ListNode * pTail1 = pHead1;while (pTail1->m_pNext != NULL){pTail1 = pTail1->m_pNext;len1++;}int len2 = 1;ListNode * pTail2 = pHead2;while (pTail2->m_pNext != NULL){pTail2 = pTail2->m_pNext;len2++;}if (pTail1 != pTail2) // 不相交直接返回NULLreturn NULL;ListNode * pNode1 = pHead1;ListNode * pNode2 = pHead2;// 先对齐两个链表的当前结点,使之到尾节点的距离相等if (len1 > len2){int k = len1 - len2;while (k--)pNode1 = pNode1->m_pNext;}else{int k = len2 - len1;while (k--)pNode2 = pNode2->m_pNext;}while (pNode1 != pNode2){pNode1 = pNode1->m_pNext;pNode2 = pNode2->m_pNext;}return pNode1;
}
思路2
我们可以运用数学的加法交换律来尝试着简化上面的写法
加法交换律:a+b=b+a
用链表来理解一下加法交换律:
链表1(a):A->B->C
链表2(b):D->E->F
a + b = A->B->C->D->E->F
b + a = D->E->F->A->B->C
链表3(a):A->B->C->F->G
链表4(b):D->E->F->G
a+b=A->B->C->F->G->D->E->F->G
b+c=D->E->F->G->A->B->C->F->G
代码
//求两个单链表相交的第一个节点
ListNode* GetFirstCommonNode(ListNode * pHead1, ListNode * pHead2)
{if(pHead1==NULL || pHead2==NULL)return NULL;ListNode* pA = pHead1;ListNode* pB = pHead2;while(pA != pB){pA = pA != nullptr ? pA->m_pNext : pHead2;pB = pB != nullptr ? pB->m_pNext : pHead1;}return pA;
}
在这里用到了 ?:三目运算符,提高运算效率,优化代码。这是以后写代码的过程中时常要注意的事情。
总结
用数学的知识点来合理优化我们写的代码
算法题:求两个单链表相交的第一个节点相关推荐
- 左神算法:两个单链表相交的一系列问题(链表是否有环 / 两无环链表是否相交 / 两有环链表是否相交)
本题来自左神<程序员代码面试指南>"两个单链表相交的一系列问题"题目. 题目 在本题中,单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2, ...
- 两个单链表相交的一系列问题-Java
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net package live.every.day.Pro ...
- 两个单链表相交的一系列问题
两个单链表相交的一系列问题 在本题中,单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2,这两个链表可能相交,也可能 不相交.请实现一个函数,如果两个链表相交,请返回相交的 ...
- 链表问题11——两个单链表相交的系列问题(四):总结
题目 请实现一个函数,如果两个链表相交,请返回相交的第一个节点,如果不相交,返回null即可.链表可能有环或无环. 要求 如果链表1的长度为N,链表2的长度为M,时间复杂度达到O(M+N),额外空间复 ...
- 两个单链表相交的一系列问题----0_0
这道题emmm,难度相对来说很大额. 主要是要分成三种情况来考虑: 1. 两个链表都无环: 2. 两个链表都有环: 3. 一个有环一个无环,这种情况是不用 考虑的,一定没有交点(姥姥记住:单链表仅有一 ...
- 链表问题11——两个单链表相交的系列问题(三):判断两个有环链表是否相交
题目 判断两个有环链表是否相交,相交则返回第一个相交节点,否则返回null 在考虑此问题时,根据前面几篇文章的解法,我们已经得到了各自链表的入环节点,分别为loop1和loop2 思路 以下是问题三的 ...
- 链表问题11——两个单链表相交的系列问题(二):找到两个无环链表的交点
题目 判断两个无环链表是否相交,相交则返回第一个相交节点,否则返回null 思路 分别遍历链表1和链表2,最后一个节点分别即为end1和end2,长度分别记为len1和len2 如果end1不等于en ...
- 链表问题11——两个单链表相交的系列问题(一):找到有环链表的环入口节点
题目 判断一个链表是否有环,如果有,则返回第一个进入环的节点,没有则返回null. 思路 如果一个链表没有环,那么遍历链表一定可以遇到链表的终点:如果链表有环,那么遍历链表就永远在环里转下去了.如何找 ...
- 算法学习18-两个单链表相交的一系列问题
两个单链表相交的一系列问题 [题目] 在本题中,单链表可能有环,也可能无环.给定两个单链表的头节点 head1和head2,这两个链表可能相交,也可能不相交.请实现一个函数, 如果两个链表相交,请返回 ...
最新文章
- kafka管理器kafka-manager部署安装
- 网页设计简约_简约设计指南
- 巨头垄断,Facebook直接封杀了一个国家!
- linux java字符集编码_Java字符集编码
- YUV420数据格式
- 问道五周年服务器维护公告,问道五周年 欢乐嘉年华
- rocketmq安装部署过程(4.0.0版本)
- java1.8win7_JDK 1.8 安装配置教程(win7 64bit )
- struts2整合spring3整合成功但是spring无法注入
- 开源的魔兽世界参考架构——mangos--网络游戏引擎BigWorld 服务器介绍
- 快应用中实现自定义抽屉组件
- 宫崎骏电影-Music
- 十七、DPM模型参数设置详解
- 笔记本的网络出现红叉,网络连接不上,网络不可用
- 企业该如何用短信推广
- eap wifi 证书_用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)
- 如何一步步实现异步上传图片并预览图片(异步加载图片)
- 开源Hanlp自然语言处理Java实现(词法分析、关键词)
- 解决AttributeError: ‘NoneType‘ object has no attribute ‘val‘ if left.val!=right.val:Line 17 问题
- 移动端touch事件,实时获取touchmove移动下的最新元素