当前位置:网站首页>两个链表的第一个公共节点_链表中环的入口(剑指offer)
两个链表的第一个公共节点_链表中环的入口(剑指offer)
2022-06-24 06:42:00 【bug 郭】
两个链表的第一个公共结点
- 首先我们想到的就是先让一个链表先遍历差值个单位节点,当两个链表长度相等时,同时遍历如果有相等节点就是有公共节点!
//先计算长度差,然后让一个指针先走差值单位!
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode cur1 = pHead1;
ListNode cur2 = pHead2;
int size1 = 0;
int size2 = 0;
while(cur1!=null){
cur1 = cur1.next;
size1++;
}
while(cur2!=null){
cur2 = cur2.next;
size2++;
}
if(size1>size2){
int len = size1 - size2;
while(len-->0){
pHead1 = pHead1.next;
}
}else{
int len = size2 - size1;
while(len-->0){
pHead2 = pHead2.next;
}
}
while(pHead1!=null){
if(pHead1.val==pHead2.val){
return pHead1;
}
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return null;
}
}
- 上面的方法就是借助了路程相等,相同速度如果有公共节点肯定会相遇,我们可以将两个链表加起来,就是一个链表遍历结束,就从另一个链表的开始遍历,另一链表也是如此,就保证了长度相等,就和上面方法类似了,看下面动图分析!

- 通过两个指针速度相同,走过的路程相同必会相遇!
- cur1 走完 L1,cur1指向 L2,cur2走完L2,指向L1!
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
//定义2个指针!
// cur1 走完 L1,又从 L2开始!
// cur2 走完 L2,又从 L1开始!
// 这里两个指针速度相同,走过的长度相等,如果有相同节点肯定相遇!
ListNode cur1 = pHead1;
ListNode cur2 = pHead2;
while(cur1!=cur2){
//不存在公共节点,两个指针会来到null相等退出循环!
cur1 = (cur1==null) ? pHead2 : cur1.next;
cur2 = (cur2 == null) ? pHead1 : cur2.next;
}
return cur1;
}
}
链表中环的入口结点

- 这里通过定义两个指针,
slow走一步,fast走2步,如果有环肯定会相遇! - 快慢指针,这里通过 时间相同,
fast指针速度是slow指针的2倍,那么路程也是2倍关系! - 通过位移关系找出了,入口和相遇点的关系,
L = C-x开始节点到入口的距离等于相遇点到环的距离 - 那么我们先通过快慢指针找到相遇点,然后再走
L单位就是入口节点位置!

public ListNode EntryNodeOfLoop(ListNode pHead) {
//快慢指针,利用链表头到入口距离 = 相遇点到入口距离!
//所以当两个节点相遇后再走L距离就是入口位置!
//相遇后让其中一个指针从链头开始走L,一个从相遇点开始!
ListNode slow = pHead,fast = pHead;
while(fast!=null&&fast.next!=null){
//注意判断条件!!!!
fast = fast.next.next;
slow = slow.next;
if(fast==slow){
//相遇!
//让slow从头结点开始!
slow = pHead;
while(fast!=slow){
slow = slow.next;
fast = fast.next;
}
return fast;
}
}
return null;
}
- 注意,这里的快慢指针,只能是一个走1步,一个走2步!其他关系可能无法保证相遇!
边栏推荐
- SAP实施项目上的内部顾问与外部顾问,相互为难还是相互成就?【英文版】
- Spark project Packaging Optimization Practice
- 在产业互联网时代不再有真正意义上的中心,这些中心仅仅只是化有形为无形而已
- Canal安装配置
- 2022蓝队HW初级面试题总结
- [binary number learning] - Introduction to trees
- How to make a website? What should I pay attention to when making a website?
- Are internal consultants and external consultants in SAP implementation projects difficult or successful? [English version]
- Leetcode概率题面试突击系列11~15
- JVM debugging tool -jps
猜你喜欢
随机推荐
Win11笔记本省电模式怎么开启?Win11电脑节电模式打开方法
. Net7 miniapi (special part):preview5 optimizes JWT verification (Part 1)
JVM debugging tool -arthas
Why use lock [readonly] object? Why not lock (this)?
Use of SQL join
OMX initialization process
华为云图引擎服务
Hyperledger fabric ledger snapshot - fast data synchronization
【图像融合】基于方向离散余弦变换和主成分分析的图像融合附matlab代码
潞晨科技获邀加入NVIDIA初创加速计划
智能视觉组A4纸识别样例
[cloud based co creation] overview of the IOT of Huawei cloud HCIA IOT v2.5 training series
原神方石机关解密
毕业季进击的技术
为什么要用lock 【readonly】object?为什么不要lock(this)?
NVIDIA control panel does not open what is NVIDIA control panel
What is the OSI seven layer model? What is the role of each layer?
Overview of cloud computing advantages of using cloud computing
The cloud monitoring system hertzbeat V1.1.0 is released, and a command starts the monitoring journey!
c#:互斥锁的使用









