题解 | 简单易懂,注释详细

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

http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46

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

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
        public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode dummy1 = pHead1;
        ListNode dummy2 = pHead2;

        int len1 = 0;
        int len2 = 0;

        // 统计两个链表的长度
        while (dummy1 != null) {
            dummy1 = dummy1.next;
            len1++;
        }
        while (dummy2 != null) {
            dummy2 = dummy2.next;
            len2++;
        }
        if (len1 == 0 || len2 == 0) {
            return null;
        }
        // 找到较长的列表放在第一位
        if (len1 > len2) {
            return find(len1 - len2, pHead1, pHead2);
        } else {
            return find(len2 - len1, pHead2, pHead1);
        }

    }

    private ListNode find(int gap, ListNode pHead1, ListNode pHead2) {

        // 较长的链表先走多出的长度
        for (int i = 0; i < gap; i++) {
            pHead1 = pHead1.next;
        }
        // 这时候剩下的长度一样多,只要不相等就一直向后
        while (pHead1 != null && pHead2 != null && pHead1 != pHead2) {
            pHead1 = pHead1.next;
            pHead2 = pHead2.next;
        }
        return pHead1;
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务