剑指offer: 找出两个链表的第一个公共结点(细节解释两种方法)

题目描述

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

思路:

1、首先需要明确的是两个链表在有第一个公共结点后,其为共尾的,就是后面的结点都是一样的,这是由链表的性质

决定的;

2、可以利用HashMap的性质来做,key设置成结点(方法一),注意对HashMap的方法put、containsKey等方法的使用;

3、由于是共尾的,为节省时间,可以让长链表减去短的链表的长度后开始进行比较(方法二);

4、对链表的长度需要构造一个getLength的方法,一般定义为public static  返回类型  方法名称 (参数类型  参数名称){  }

import java.util.*;
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode temp1=pHead1;
        ListNode temp2=pHead2;
        HashMap<ListNode, Integer>  map=new  HashMap<ListNode, Integer> ();
        while(temp1!=null){
            map.put(temp1, null); //这里只用到了关键字,后面的数字表示为null
            temp1=temp1.next;
        }
        while (temp2 != null) {
            if (map.containsKey(temp2))
                return temp2;
            temp2 = temp2.next;
        }
 
        return null;
    }
}

30ms

public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode current1 = pHead1;// 链表1
        ListNode current2 = pHead2;// 链表2
        if (pHead1 == null || pHead2 == null)
            return null;
        int length1 = getLength(current1);
        int length2 = getLength(current2);
        // 两连表的长度差
         
        // 如果链表1的长度大于链表2的长度
        if (length1 >= length2) {
            int len = length1 - length2;
            // 先遍历链表1,遍历的长度就是两链表的长度差
            while (len > 0) {
                current1 = current1.next;
                len--;
            }
 
        }
        // 如果链表2的长度大于链表1的长度
        else if (length1 < length2) {
            int len = length2 - length1;
            // 先遍历链表1,遍历的长度就是两链表的长度差
            while (len > 0) {
                current2 = current2.next;
                len--;
            }
 
        }
        //开始齐头并进,直到找到第一个公共结点
        while(current1!=current2){
            current1=current1.next;
            current2=current2.next;
        }
        return current1;
 
    }
 
    // 求指定链表的长度
    public static int getLength(ListNode pHead) {
        int length = 0;
 
        ListNode current = pHead;
        while (current != null) {
            length++;
            current = current.next;
        }
        return length;
    }

}
26ms

猜你喜欢

转载自blog.csdn.net/weixin_30363263/article/details/80755784