一 ,穷举肯定不行,复杂度太大
二 ,容易想到的思路是通过将一个链表构造成环,然后转化为判断另一个单向链表与环相交的问题。
三 ,在网上看到一种新奇的思路,由于M+N=N+M,所以转化为了这样:
P1指向Phead1,P2指向Phead2,同时向后移动,当一个较短的链表遍历结束就指向到另一个链表表头,
同理对长链表指针,相当于两个链表指针都走过了M+N的长度,若有相交的,则必定会在遍历中找到。
代码实现如下:
/*
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;
while(p1!=p2){
if(p1!=null)
p1=p1.next;
if(p2!=null)
p2=p2.next;
if(p1!=p2){
if(p1==null)
p1=pHead2;
if(p2==null)
p2=pHead1;
}
}
return p1;
}
}