两个链表的第一个公共结点

Posted 氵冫丶

tags:

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

题目

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

解题

说明:
1.单链表
2.相交后不会分开,因为分开后一个结点有两个下一个结点就不是单链表了
两个链表呈Y
如果两个链表两个指针向前走,相遇结点就是第一个公共结点,但是两个指针走的长度不一样
两个指针走了不同长度的Y上面的两个叉,如果求出两个指针分布应该走的两个叉的结点个数后,那么下一个结点就是他们第一个公共结点。
如果求出两个链表的长度:aLen,bLen
若a走x,b走y后相遇
有下面等式:
x+z=aLen
y+z=bLen
z表示两个链表的公共长度
等式相减:x?y=aLen?bLen
两个链表长度的差,就是两个指针走过的结点个数的差
所以,长的链表,先走这个差值
后,两个指针一起走
相遇后就是第一个公共结点了

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

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if(pHead1 == null || pHead2 ==null)
            return null;
        ListNode p1 = pHead1;
        ListNode p2 = pHead2;
        int p1Len = depth(pHead1);
        int p2Len = depth(pHead2);
        if(p2Len >p1Len)
            return FindFirstCommonNode(pHead2,pHead1);
        int diff = p1Len - p2Len;
        while(diff!=0){
            p1 = p1.next;
            diff--;
        }
        while(p2Len>0){
            if(p1 == p2)
                return p1;
            p1 = p1.next;
            p2 = p2.next;
        }
        return p1;
    }
    public int depth(ListNode head){
        if(head == null)
            return 0;
        if(head.next == null)
            return 1;
        return 1 + depth(head.next);
    }
}

讨论中看到用Hash
记录第一个链表出现的每个结点
再遍历第二个链表,判断map中是否已经存在

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

    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.HashMap;
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode p1 = pHead1;
        ListNode p2 = pHead2;


        HashMap<ListNode, Integer> hashMap = new HashMap<ListNode, Integer>();
        while (p1 != null) {
            if (hashMap.containsKey(p1)){
                hashMap.put(p1,hashMap.get(p1)+1);
            }else
                hashMap.put(p1, 1);
            p1 = p1.next;
        }
        while (p2 != null) {
            if (hashMap.containsKey(p2))
                return p2;
            p2 = p2.next;
        }

        return null;

    }
}

讨论中下面方法理解不透

import java.util.HashMap;
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;

    }
}

以上是关于两个链表的第一个公共结点的主要内容,如果未能解决你的问题,请参考以下文章

两个链表的第一个公共结点

[ 链表OJ题--C语言] 相交链表 两个链表的第一个公共结点

两个链表的第一个公共结点

剑指Offer 两个链表的第一个公共结点

剑指offer--44.两个链表的第一个公共结点

链表两个链表的第一个公共结点