160. Intersection of Two Linked Lists(剑指Offer-两个链表的第一个公共结点)
题目:
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
begin to intersect at node c1.
思路1:
若两个链表具有交点:1.链表的长度差=相交前的长度差;2.两个链表的最后一个节点相同
因此,具体步骤如下:
1.先计算出两个链表的长度,并得到它们的长度差。
2.在计算长度的过程中,若发现两个链表的最后一个节点不相等,则证明它们没有交点。
3.相对长的链表头部向前移动和长度差大小一样的节点后,两个链表的头部一起向前移动,最终得到交点。
代码1:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) :
val(x), next(NULL) { }
};
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (headA == NULL || headB == NULL) {
return NULL;
}
int i;
int lenA = ;
int lenB = ;
ListNode *tempA = headA;
while (tempA->next != NULL) {
tempA = tempA->next;
lenA++;
}
ListNode *tempB = headB;
while (tempB->next != NULL) {
tempB = tempB->next;
lenB++;
}
if (tempA != tempB) {
return NULL;
}
if (lenA > lenB) {
for (i = ; i < lenA - lenB; i++) {
headA = headA->next;
}
} else if (lenA < lenB) {
for (i = ; i < lenB - lenA; i++) {
headB = headB->next;
}
}
while (headA != headB) {
headA = headA->next;
headB = headB->next;
}
return headA;
}
};
思路2:
思路1需要分别计算链表的长度,思路2则不需要计算长度。用两个指针扫描两个链表,最终两个指针到达NULL或者到达公共结点。
假设链表的长度分别为len1和len2,相交后的公共长度为len。长度短的链表优先完成扫描后再去扫描长度长的链表;长度长的链表完成扫描后,去扫描长度短的链表,当两个指针相遇时,指针1走过的长度为len1+len2-len,指针2走过的长度为len2+len1-len,由此可见指针1和指针2走过了相同的长度。
我们分4种情况讨论两个链表相交的情况。
- 两个链表长度相同且无公共交点,此时返回NULL;
- 两个链表长度相同且有公共交点,只需要遍历一遍就可以得到公共交点;
- 两个链表长度不同且无公共交点,两遍扫描后返回NULL;
- 两个链表长度不同且有公共交点,在第二遍扫描的过程中可以相遇。
代码2:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1 == NULL || pHead2 == NULL)
return NULL; ListNode *p1 = pHead1;
ListNode *p2 = pHead2;
while(p1 != p2){
if(p1 != NULL)
p1 = p1->next;
else
p1 = pHead2; if(p2 != NULL)
p2 = p2->next;
else
p2 = pHead1;
}
return p1;
}
};
160. Intersection of Two Linked Lists(剑指Offer-两个链表的第一个公共结点)的更多相关文章
- 剑指Offer 两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点. 思路: 题目说的很笼统,应该是有2个链表,找出公共点,第一个公共点后面的链表是共同所有的.可以用map做,直接检测map里有没有出现这个节点. ...
- 剑指Offer——两个链表的第一个公共结点
题目描述: 输入两个链表,找出它们的第一个公共结点. 分析: 设置两个指针,分别从两个链表的头部开始往后遍历. 谁遍历完自己本身的,就从另一个链表开始遍历,这样大家到达第一个公共结点的时候便会相遇. ...
- 用js刷剑指offer(两个链表的第一个公共结点)
题目描述 输入两个链表,找出它们的第一个公共结点. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ fun ...
- 剑指offer--44.两个链表的第一个公共结点
@selfboot 牛逼的代码,长度相同,一遍出结果, 长度不同,短的点跑完,变成长的,当长的跑完变成短的链表的时候,较长的链表已经走过了多的结点. ------------------------- ...
- 剑指Offer-35.两个链表的第一个公共结点(C++/Java)
题目: 输入两个链表,找出它们的第一个公共结点. 分析: 先统计两个链表的长度,计算他们的差值,然后将两个链表对齐,再去寻找公共节点即可. 程序: C++ class Solution { publi ...
- [剑指Offer]52-两个链表的第一个公共节点
题目链接 https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&t ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- 剑指Offer - 九度1505 - 两个链表的第一个公共结点
剑指Offer - 九度1505 - 两个链表的第一个公共结点2013-11-24 20:09 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例.对于每个测试案例 ...
- 剑指Offer(三十六):两个链表的第一个公共结点
剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- 【剑指Offer面试编程题】题目1505:两个链表的第一个公共结点--九度OJ
题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表 ...
随机推荐
- luogu P2713 罗马游戏
思路 模拟就好 左偏树合并 并查集寻找 代码 #include <bits/stdc++.h> #define FOR(i,a,b) for(int i=a;i<=b;++i) us ...
- Python, pandas: how to sort dataframe by index// Merge two dataframes by index
pd.concat([df1, df2], axis=1) df.sort_index(inplace=True) https://stackoverflow.com/questions/404680 ...
- DPDK 网卡绑定和解绑
参考: DPDK网卡绑定和解绑 DPDK的安装与绑定网卡 DPDK 网卡绑定和解绑 注意: 建议不要使用本文的eth0网卡绑定dpdk驱动. 1.进入DPDK目录: $ cd dpdk/tools/ ...
- CentOS7使用firewalld和selinux
转载自莫小安的博客:https://www.cnblogs.com/moxiaoan/p/5683743.html 如何查看和使用selinux https://blog.csdn.net/edide ...
- jmeter命令行模式运行,实时获取压测结果
jmeter命令行模式运行,实时获取压测结果 jmeter很小,很快,使用方便,可以在界面运行,可以命令行运行.简单介绍下命令行运行的方式: sh jmeter.sh -n -t my-script. ...
- Js操作Cookie的实现
- 关于在mac安装安卓的模拟器的一些些那点事情~~~
ook~~自己捣鼓了三天终于安装成功了~妹的~踩了太多的坑~整个人就不好了~ 为了节省大家的时间~所以今天我就将我安装的过程整体思路教给大家!有了思路安装起来就很好了!!!但是 注意的是,也许你会出现 ...
- codeforces 767C - Garland
题目链接:http://codeforces.com/contest/767/problem/C 问能否将一棵带点权的书分成点权$3$块,求任意方案. 其实考虑一棵以$x$为根的子树权值为${\fra ...
- sqlserver 中常见的函数 数学函数
create table testnum( ID int identity(1,1), num float) insert testnum values (1) insert testnum valu ...
- 详细解说Tomcat 设置虚拟路径的几种方法及为什么设置虚拟路径
说明:此次使用的是Tomcat 7.0 很多朋友都会很疑惑,既然我们都知道在Tomcat服务器上部署项目只要将项目打包,然后放到webapps目录下就可以了,为什么还需要配置虚拟路径?的确,把项目放到 ...