剑指offer-36:两个链表的第一个公共结点

本文介绍了一种寻找两个链表第一个公共节点的有效算法。通过计算链表长度差并同步遍历,或使用双指针技巧,可在O(n)时间内解决此问题。适用于面试准备和链表相关问题解决。

题目描述

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

思路

如果两个链表有共同结点,那一定是Y结构而不是X结构,以为单链表只有一个next。如下图。
在这里插入图片描述
找出两个链表的长度差,长的先遍历长度差的距离,然后依次对比。

代码

public class Solution36 {

    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if(pHead1==null||pHead2==null)
            return null;
        int len1=getlen(pHead1);
        int len2=getlen(pHead2);
        if(len1>len2){
            int len=len1-len2;
            while(len-->0)
                pHead1=pHead1.next;

        }else{
            int len=len2-len1;
            while(len-->0)
                pHead2=pHead2.next;
        }

        while(pHead1!=null&&pHead2!=null){
            if(pHead1.val==pHead2.val)
                return pHead1;
            else{
                pHead1=pHead1.next;
                pHead2=pHead2.next;
            }
        }
        return null;

    }
    public int getlen(ListNode head){
        int count=0;
        while(head!=null){
            count++;
            head=head.next;
        }
        return count;
    }


    public static void main(String[] args) {

        ListNode node1=new ListNode(1);
        ListNode node2=new ListNode(2);
        ListNode node3=new ListNode(3);
        ListNode node4=new ListNode(4);
        ListNode node5=new ListNode(5);
        ListNode node6=new ListNode(6);
        ListNode node7=new ListNode(7);

        node1.next=node2;
        node2.next=node3;
        node3.next=node6;

        node4.next=node5;
        node5.next=node6;

        node6.next=node7;

        ListNode node=new Solution36().FindFirstCommonNode(node1,node4);
        if(node==null){
            BeanUtil.print("null");
        }else{
            BeanUtil.print(node.val);
        }


    }

}

再说一个leetcode上的方法

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;
      
}

代码分析

长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL
长度不同有公共结点,第一遍差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。

最坏的情况就是没有相同点:
p1先遍历pHead1,在遍历pHead2,直到最后为null。
p2先遍历pHead2,在遍历pHead1,直到最后为null。
最后,两者为null相遇。

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值