剑指Offer---面试题37:两单链表中第一个公共节点

Posted 范二er

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer---面试题37:两单链表中第一个公共节点相关的知识,希望对你有一定的参考价值。

一 题目

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

public class ListNode 
    int val;
    ListNode next = null;

    ListNode(int val) 
        this.val = val;
    

二 思路

假设单链表1表长n, 单链表2表长m;

思路1:遍历单链表1(表长n),每遍历一个节点就循环遍历单链表2(表长m)所有节点,若发现节点的val域相同,则返回该节点,若单链表1遍历结束任然未发现相同的节点,则返回null
时间复杂度n(nm)

思路2:若两单链表存在公共节点,那么从第一个公共节点开始一直到尾节点,都是相同的。那么我们从尾节点开始向前扫描,扫描到最后一个相同的节点时候,该节点就是第一个公共节点。 但是单链表具备单向可及性想拿到尾节点就必须从头开始扫描,所以可以使用的特性先进后出来解决这一问题。(即扫描到的第一个节点最后比较,扫描到的最后一个节点最先比较,两个栈)
时间复杂度o(m+n);空间复杂度o(m+n)

思路3:前面 剑指Offer—面试题15:链表中的倒数第k个节点中提到:当我们用一个指针不能解决链表问题的时 候,我们可以用两个指针,一个走得快一点,一个走的慢一点,或者可以让一个指针在链表中先走上若干步
这道题目仍然可以使用这种思路来解决,首先我们计算出两链表的差值firstStep,然后让较长链表的头指针先走firstStep步,然后两链表头指针同时往后面走,当碰到第一个val域相同的节点时,该节点就是第一个公共的节点;
时间复杂度n(n+m)


三 代码

public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) 
        if(pHead1==null||pHead2==null)
            return null;
        
        ListNode tempP1=pHead1;
        ListNode tempP2=pHead2;
        int length1=0,length2=0,firstStep=0;

        while(tempP1.next!=null)
            length1+=1;
            tempP1=tempP1.next;
        
        while(tempP2.next!=null)
            length2+=1;
            tempP2=tempP2.next;
        
        //两链表长度的差值
        firstStep=length1-length2;
       //若链表1长些,则链表1头指针先走 
       if(firstStep>0)
           while(firstStep!=0)
               pHead1=pHead1.next;
               --firstStep;
           
       else //若链表2长些,则链表2头指针先走 
           while(firstStep!=0)
               pHead2=pHead2.next;
               ++firstStep;
           
       
        //两头指针再一起走,碰到相同的就返回
        while(pHead1!=null&&pHead2!=null)
            if(pHead1.val==pHead2.val)
                return pHead1;
            else
                pHead1=pHead1.next;
                pHead2=pHead2.next;
            
        
       return null;
       

四 总结

  1. 从时间复杂度和空间复杂度的角度去考虑这个问题,根据具体情况使用具体的方法。
  2. 当我们用一个指针不能解决链表问题的时 候,我们可以用两个指针,一个走得快一点,一个走的慢一点,或者可以让一个指针在链表中先走上若干步

以上是关于剑指Offer---面试题37:两单链表中第一个公共节点的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer demo之单链表反转

剑指Offer-时间效率与空间效率的平衡面试题50.2:字符流中第一个不重复的字符

剑指offer面试题17:合并两个排序的链表

单链表复制早已难不到你,但若我们再加个指针...

剑指offer 面试37题

《剑指offer》面试题10:链表中倒数第k个节点