剑指offer----两个链表的第一个公共节点

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

这个题应该算是倒数第k个节点的一个简化版

剑指offer----倒数第k个节点

/*
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 length1 = getListLength(pHead1);
        int length2 = getListLength(pHead2);
        boolean one = length1 > length2;
        int distance = one ? length1 - length2 : length2 - length2;
        if(one){
            pHead1 = walkDistance(pHead1, distance);
        }else{
            pHead2 = walkDistance(pHead2, distance);
        }
        while(pHead1 != null){
            if(pHead1 == pHead2){
                return pHead1;
            }
            pHead1 = pHead1.next;
            pHead2 = pHead2.next;
        }
        return null;
    }
    int getListLength(ListNode pHead){
        int length = 0;
        while(pHead != null){
            pHead = pHead.next;
            length++;
        }
        return length;
    }
    ListNode walkDistance(ListNode pHead, int distance){
        while(distance != 0){
            pHead = pHead.next;
            distance--;
        }
        return pHead;
    }
}

我们要知道这样一件事,如果因为一个节点只有一个next指针,那么如果两个链表有公共节点,他们公用一个尾巴
计算出两个节点的长度,并求差值d,让较长的链表先走d个节点,然后两个链表同时出发,他们就会同时到达公共节点。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载请注明出处:http://www.jianshu.com/p/c65d9d753c31 在上一篇博客《数据结构...
    Alent阅读 3,528评论 4 74
  • 链表 记录《剑指offer》中所有关于链表的题目,以及LeetCode中的相似题目 相关题目列表 题目 链表是面试...
    wenmingxing阅读 1,180评论 0 11
  • 本系列导航:剑指offer(第二版)java实现导航帖 面试题52:两个链表的第一个公共节点 题目要求:输入两个单...
    ryderchan阅读 1,053评论 3 2
  • 用流逝这个词来形容时间真是再贴切不过了。你感受得到时间的流动,但它又是那么悄无声息,一晃2017年已经离我们半个月...
    学习思考行动阅读 191评论 2 0
  • 学校,自毕业后已经有十个月没有回来过了,提前一个月就和你们计划要回来吃二餐二楼饼姐家的饼,南门李**家的烧烤,清泉...
    啾啾咩阅读 424评论 0 1