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

题目描述

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

解题思路

首先求出两个链表的长度,长的链表先走到和短的链表具有相同长度的位置,然后同时遍历比较两个链表,直到找到相同的结点。

实现

/*链表结点定义*/
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;

        int len1 = getLength(pHead1);
        int len2 = getLength(pHead2);

        int gap = 0;

        ListNode p1,p2;
        if (len1 > len2) {
            p1 = pHead1;
            p2 = pHead2;
            gap = len1 - len2;
        }else {
            p1 = pHead2;
            p2 = pHead1;
            gap = len2 - len1;
        }

        for (int i = 0; i < gap; i++){
           if (p1!= null) p1 = p1.next;
        }

        while (p1 != null && p2 != null){
            if (p1 == p2) return p1;
            p1 = p1.next;
            p2 = p2.next;
        }

        return null;
    }

    private int getLength(ListNode head) {
        ListNode p = head;
        int count = 0;
        while (p != null) {
            count++;
            p = p.next;
        }
        return count;
    }
}
posted @ 2016-08-22 09:04  峰扬迪  阅读(81)  评论(0编辑  收藏  举报