JZ36-两个链表的第一个公共节点
题目:输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
解题思路:首先理解这样的一个数据结构,两个链表第一个公共节点之后一定全是公共节点了。两个前面非公共节点数量相同的就很简单了,直接从两个头结点依次往下走就可以;但是遇到前面非公共节点数量不同的这种办法就不可用了,这里就想到将前面的非公共节点数量变成相同的不就解决了。虽然不知道公共节点之前的数量,但是两条链非公共节点的总数量之和是一定的。
比如:第一条链非公共节点1-2-3;第二条链非公共节点:7-8;两条链公共节点4-5-6
第一步:将两条链从头到尾遍历一遍是肯定是找不到公共节点了;
第二步:第一遍遍历结束后接着从头遍历另一条;
这样就有1-2-3-4-5-6-7-8-4-5-6和7-8-4-5-6-1-2-3-4-5-6
第三步:遍历两遍之后节点数量相同,最后的末尾又肯定是公共节点,这样很容易就能找到公共节点。
模型:
/**
*模型:1-2-3
* \
* 4-5-6
* /
* 7-8
*node1路径:1-2-3-4-5-6-7-8-4-5-6
*node2路径:7-8-4-5-6-1-2-3-4-5-6
*/
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
/**
*模型:1-2-3
* \
* 4-5-6
* /
* 7-8
*node1路径:1-2-3-4-5-6-7-8-4-5-6
*node2路径:7-8-4-5-6-1-2-3-4-5-6
*/
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
//创建两个移动节点
ListNode node1 = pHead1;
ListNode node2 = pHead2;
//进行判断是否到同一节点
while(node1 != node2){
if(node1 != null){
//往下移动节点
node1 = node1.next;
}else{
//当第1个链走到结尾,开始走第2条链
node1 = pHead2;
}
if(node2 != null){
//往下移动节点
node2 = node2.next;
}else{
//当第2个链走到结尾,开始走第1条链
node2 = pHead1;
}
}
return node1;
}
}