剑指offer--算法题--25--两个链表的第一个公共结点

题目描述:

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

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表的元素的个数。
接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开。第二行为第二个链表的所有元素,中间用空格隔开。

输出:

对应每个测试案例,
输出两个链表的第一个公共结点的值。
如果两个链表没有公共结点,则输出“My God”。

样例输入:

5 4
1 2 3 6 7
4 5 6 7
3 3
1 5 7
2 4 7
2 3
1 3
4 5 6

样例输出:

6
7
My God

    画图有助于我们理解,画图会发现如果二者有公共结点,则公共节点后面的节点也都是公共节点。用两个辅助栈,将两个链表从头分别压入栈,最后二者出栈,最后一个相同的出栈元素即为公共节点。但这样需要开辟两个栈的空间,实际上,可以不用开辟空间,分别求出二者的长度,求出二者的差dis,而后将指向长的链表的指针先在长链表上走dis步,而两个链表同时走,二者会同时走到第一个公共节点处。

代码

package JvavaDataTest;

import java.util.List;

public class FindFirstCommonNode {
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        listNode1.lnNext = listNode2;
        ListNode listNode3 = new ListNode(3);
        listNode2.lnNext = listNode3;
        ListNode listNode4 = new ListNode(4);
        listNode3.lnNext = listNode4;
        ListNode listNode5 = new ListNode(5);
        listNode4.lnNext = listNode5;
        ListNode listNode6 = new ListNode(6);
        listNode5.lnNext = listNode6;
        ListNode listNode7 = new ListNode(7);
        ListNode listNode8 = new ListNode(8);
        listNode7.lnNext = listNode8;
        listNode8.lnNext = listNode4;  //这块就是他们的交互点 4

        FindFirstCommonNode findFirstCommonNode = new FindFirstCommonNode();
        int n = findFirstCommonNode.FindFirstCommonNode(listNode1,listNode7);
        System.out.println("交互的节点的值为:"+n);

    }
    public int FindFirstCommonNode(ListNode pHead1,ListNode pHead2){
        int length1 = getLength(pHead1);
        int length2 = getLength(pHead2);
        if(length1 == 0 || length2 == 0){
            return 0;
        }

        ListNode pointLongListNode = null;
        ListNode pointShortListNode = null;
        int dif = 0;
        if(length1 > length2){
            pointLongListNode =  pHead1;
            pointShortListNode = pHead2;
        }else{
            pointLongListNode =  pHead1;
            pointShortListNode = pHead2;
        }
        dif = Math.abs(length1 - length2);
        for (int i = 0;i<dif;i++){
            pointLongListNode = pointLongListNode.lnNext;
        }
        while(pointLongListNode != null
                && pointShortListNode != null
                && pointLongListNode != pointShortListNode
                ){
            pointLongListNode = pointLongListNode.lnNext;
            pointShortListNode = pointShortListNode.lnNext;
        }
        return pointLongListNode.val;
    }
    private int getLength(ListNode ln){
        if(ln == null){
            return 0;
        }
        ListNode head = ln;
        int len = 0;
        while(head.lnNext != null){
            head = head.lnNext;
            len++;
        }
        return len;
    }
}
class ListNode{
    int val = 0;
    ListNode lnNext = null;
    public ListNode(int val){
        this.val = val;
    }
}

结果:

猜你喜欢

转载自blog.csdn.net/lsm18829224913/article/details/81191297
今日推荐