劍指offer-36:兩個連結串列的第一個公共結點
阿新 • • 發佈:2018-12-14
題目描述
輸入兩個連結串列,找出它們的第一個公共結點。
思路
如果兩個連結串列有共同結點,那一定是Y結構而不是X結構,以為單鏈表只有一個next。如下圖。
找出兩個連結串列的長度差,長的先遍歷長度差的距離,然後依次對比。
程式碼
public class Solution36 {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1==null||pHead2==null)
return null;
int len1=getlen(pHead1);
int len2=getlen(pHead2);
if(len1>len2){
int len=len1-len2;
while(len-->0)
pHead1=pHead1.next;
}else{
int len=len2-len1;
while(len-->0)
pHead2=pHead2.next;
}
while (pHead1!=null&&pHead2!=null){
if(pHead1.val==pHead2.val)
return pHead1;
else{
pHead1=pHead1.next;
pHead2=pHead2.next;
}
}
return null;
}
public int getlen(ListNode head){
int count= 0;
while(head!=null){
count++;
head=head.next;
}
return count;
}
public static void main(String[] args) {
ListNode node1=new ListNode(1);
ListNode node2=new ListNode(2);
ListNode node3=new ListNode(3);
ListNode node4=new ListNode(4);
ListNode node5=new ListNode(5);
ListNode node6=new ListNode(6);
ListNode node7=new ListNode(7);
node1.next=node2;
node2.next=node3;
node3.next=node6;
node4.next=node5;
node5.next=node6;
node6.next=node7;
ListNode node=new Solution36().FindFirstCommonNode(node1,node4);
if(node==null){
BeanUtil.print("null");
}else{
BeanUtil.print(node.val);
}
}
}
再說一個leetcode上的方法
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;
}
程式碼分析
長度相同有公共結點,第一次就遍歷到;沒有公共結點,走到尾部NULL相遇,返回NULL
長度不同有公共結點,第一遍差值就出來了,第二遍一起到公共結點;沒有公共,一起到結尾NULL。
最壞的情況就是沒有相同點:
p1先遍歷pHead1,在遍歷pHead2,直到最後為null。
p2先遍歷pHead2,在遍歷pHead1,直到最後為null。
最後,兩者為null相遇。