面試題52:兩個連結串列的第一個公共節點
/*
* 面試題52:兩個連結串列的第一個公共節點
* 題目:輸入兩個連結串列,找出它們的第一個公共結點
* 思路:首先遍歷兩個連結串列得到它們的長度,比較長短。
* 第二遍,在較長的連結串列上先走若干步,接著同時在兩個連結串列上遍歷
* 找到的第一個相同的節點就是它們的第一個公共節點
*/
class ListNode6 {
int val;
ListNode6 next = null;
ListNode6(int val) {
this.val = val;
}
}
public class No52FindFirstCommonNode {
public static void main(String[] args) {
No52FindFirstCommonNode n = new No52FindFirstCommonNode();
ListNode6 p1 = new ListNode6(1);
ListNode6 p2 = new ListNode6(2);
ListNode6 p3 = new ListNode6(3);
ListNode6 p4 = new ListNode6(4);
ListNode6 p5
= new ListNode6(5);ListNode6 p6 = new ListNode6(6);
ListNode6 p7 = new ListNode6(7);
p1.next = p2;
p2.next = p3;
p3.next = p6;
p6.next = p7;
p4.next = p5;
p5.next = p6;
System.out.print(n.FindFirstCommonNode(p1, p4).val);
}
public ListNode6 FindFirstCommonNode(ListNode6 pHead1, ListNode6 pHead2) {
ListNode6 p1 = pHead1;
ListNode6 p2 = pHead2;
int size1 = 0;
int size2 = 0;
//遍歷出連結串列1的長度
while(p1 != null) {
size1++;
p1 = p1.next;
}
//遍歷出連結串列2的長度
while(p2 != null) {
size2++;
p2 = p2.next;
}
p1 = pHead1;
p2 = pHead2;
//連結串列2長,先走
if(size1 < size2) {
int p = size2 - size1 - 1;
while (p >= 0) {
p2 = p2.next;
p--;
}
} else {//連結串列1長,先走
int p = size1 - size2 - 1;
while (p >= 0) {
p1 = p1.next;
p--;
}
}
//同時遍歷,直到遇到第一個相同的節點
while (p1 != p2 && p1 != null && p2 != null) {
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
}