码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-06-24 15:26:08      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

题目

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

解题

说明:
1.单链表
2.相交后不会分开,因为分开后一个结点有两个下一个结点就不是单链表了
两个链表呈Y
如果两个链表两个指针向前走,相遇结点就是第一个公共结点,但是两个指针走的长度不一样
两个指针走了不同长度的Y上面的两个叉,如果求出两个指针分布应该走的两个叉的结点个数后,那么下一个结点就是他们第一个公共结点。
如果求出两个链表的长度:aLen,bLen
若a走x,b走y后相遇
有下面等式:
x+z=aLen
y+z=bLen
z表示两个链表的公共长度
等式相减:x?y=aLen?bLen
两个链表长度的差,就是两个指针走过的结点个数的差
所以,长的链表,先走这个差值
后,两个指针一起走
相遇后就是第一个公共结点了

/*
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;
        ListNode p1 = pHead1;
        ListNode p2 = pHead2;
        int p1Len = depth(pHead1);
        int p2Len = depth(pHead2);
        if(p2Len >p1Len)
            return FindFirstCommonNode(pHead2,pHead1);
        int diff = p1Len - p2Len;
        while(diff!=0){
            p1 = p1.next;
            diff--;
        }
        while(p2Len>0){
            if(p1 == p2)
                return p1;
            p1 = p1.next;
            p2 = p2.next;
        }
        return p1;
    }
    public int depth(ListNode head){
        if(head == null)
            return 0;
        if(head.next == null)
            return 1;
        return 1 + depth(head.next);
    }
}

讨论中看到用Hash
记录第一个链表出现的每个结点
再遍历第二个链表,判断map中是否已经存在

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

    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.HashMap;
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode p1 = pHead1;
        ListNode p2 = pHead2;


        HashMap<ListNode, Integer> hashMap = new HashMap<ListNode, Integer>();
        while (p1 != null) {
            if (hashMap.containsKey(p1)){
                hashMap.put(p1,hashMap.get(p1)+1);
            }else
                hashMap.put(p1, 1);
            p1 = p1.next;
        }
        while (p2 != null) {
            if (hashMap.containsKey(p2))
                return p2;
            p2 = p2.next;
        }

        return null;

    }
}

讨论中下面方法理解不透

import java.util.HashMap;
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode p1 = pHead1;
        ListNode p2 = pHead2;
        while(p1!=p2){
            p1 = (p1==null ? pHead2 : p1.next);
            p2 = (p2==null ? pHead1 : p2.next);
        }
        return p1;

    }
}

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

标签:

原文地址:http://blog.csdn.net/qunxingvip/article/details/51747163

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!