剑指Offer:JZ36 - 两个链表的第一个公共节点(解题思路+Java代码)

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值