剑指offer试题编程练习33(java) 寻找两个链表的公共节点

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

思路:两个链表的公共节点,因为每个节点只有一个next,所以如果两个链表有公共节点的话,那么从该公共节点开始后面的所有节点相同,则可通过得到两个链表的长度,找到长链表与短链表长度相同的一个起点,逐一与短链表的节点进行比较。

/*
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 sizeA = getSize(pHead1);
        int sizeB = getSize(pHead2);
        ListNode pos1 = pHead1;
        ListNode pos2 = pHead2;
        int start=0;  //找到开始比较的起点
        if(sizeA>sizeB){
            //链表1较长先行
            start = sizeA-sizeB;
            for(int i=0;i<start;i++){
                pos1 = pos1.next;
            }
        }else{
            start = sizeB-sizeA;
            for(int i=0;i<start;i++){
                pos2 = pos2.next;
            }
        }
        //开始比较两个链表是否有共同节点
        while(pos1!=null){
            if(pos1==pos2){
                return pos1;
            }
            pos1 = pos1.next;
            pos2 = pos2.next;
        }
        return null;
    }
    
    public int getSize(ListNode head){
        int size=0;
        ListNode p = head;
        while(p!=null){
            size++;
            p = p.next;
        }
        return size;
    }
}
发布了49 篇原创文章 · 获赞 0 · 访问量 804

猜你喜欢

转载自blog.csdn.net/weixin_41881277/article/details/105418705