题目描述
输入两个链表,找出它们的第一个公共结点。
思路:
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