两个链表的第一个公共结点(思路与实现)

本文介绍了一种算法,用于查找两个链表的第一个公共结点。通过比较链表长度并调整遍历起点,实现了高效的公共节点查找。提供了两种实现方式,包括通过长度差同步遍历及循环遍历的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

输入两个链表,找出它们的第一个公共结点

思路:

两个链表找到公共的结点,可以肯定的是公共结点后面的结点都是相同的,那么现在就出现两种情况,一种情况是两个链表的长处相等,此时同时遍历这两个链表就可以找到。另外一种情况则是两个链表的长度不一样,此时就第一步就需要解决这个长度差,因此可以先得到两个链表的长度,将长的链表移动长度差。然后两个链表再同时走(原因是两个链表只能是不是公共区才会造成链表不一样长)。

第一种实现:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        int len1 = findLen(pHead1);
        int len2 = findLen(pHead2);
        if(len1 < len2){
            for(int j = 0; j < len2 - len1; j ++){
                pHead2 = pHead2.next;
            }
            while(pHead1 != pHead2){
                pHead1 = pHead1.next;
                pHead2 = pHead2.next;
            }
            return pHead1;
        }else if(len1 > len2){
            for(int j = 0; j < len1 - len2; j ++){
                pHead1 = pHead1.next;
            }
            while(pHead1 != pHead2){
                pHead1 = pHead1.next;
                pHead2 = pHead2.next;
            }
            return pHead1;
        }else{
            while(pHead1 != pHead2){
                pHead1 = pHead1.next;
                pHead2 = pHead2.next;
            }
            return pHead1;
        }
    }
    public static int findLen(ListNode node){
        int i = 0;
        while(node != null){
            node = node.next;
            i ++;
        }
        return i;
    }
}

第二种实现:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode p1 = pHead1;
        ListNode p2 = pHead2;
        
        while(p1 != p2){//如果这两个链表的长度一样,那么就同步。如果长度不一样,那么样能第一圈解决这个距离差
            p1 = (p1 == null? pHead2 : p1.next);
            p2 = (p2 == null? pHead1 : p2.next);
        }
        return p1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值