声明:本片文章为阅读何海涛网易日志后,自己用java实现后的学习总结。
何海涛日志:http://zhedahht.blog.163.com/blog/static/254111742008053169567/
题目:两个单向链表,找出它们的第一个公共结点。
思路:两个单向链表,如果存在公共节点,则两个链表会呈现 Y 形状,所以两个链表最后一个节点肯定是公共节点。
可以找到两个链表的最后节点,判断是否相等,如果不相等,则直接返回null。
如果相同,则判定肯定存在共存节点,就开始找第一个公共节点。因为两个链表的长度不相同。所以首先移动较长链表的指针,例如一个链表长度为length_1,另一个长度为length_2,如果length_1>length_2,则length_1对应的链表头指针向后移动length_1-length_2个节点。然后才开始进行比较。两个指针如果不相同,则共同前进,每前进一个节点,比较一次。当两个指针相同,则返回该节点。
代码:
/**
* 题目:两个单向链表,找出它们的第一个公共结点。
* @author hongbin.gao
*
*/
class Node{
int val;
Node next;
public Node(int val){
this.val = val;
}
}
public class FindFirstCommonNode {
//head1: 1->2->3->4->5->6->7->8;
//head2: 5->5->5->5->5->5->6->7->8;后面三个节点为重复节点。
public static void main(String[] args){
Node p1 = new Node(1);
Node p2 = new Node(2);
Node p3 = new Node(3);
Node p4 = new Node(4);
Node p5 = new Node(5);
Node p6 = new Node(6);
Node p7 = new Node(7);
Node p8 = new Node(8);
p1.next = p2; p2.next = p3;
p3.next = p4; p4.next = p5;
p5.next = p6; p6.next = p7;
p7.next = p8; p8.next = null;
Node q1 = new Node(5);
Node q2 = new Node(5);
Node q3 = new Node(5);
Node q4 = new Node(5);
Node q5 = new Node(5);
Node q6 = new Node(5);
q1.next = q2; q2.next = q3;
q3.next = q4; q4.next = q5;
q5.next = q6; q6.next = p6;
Node result = findFirstCommonNode(p1,q1);
System.out.println(result.val);
}
public static Node findFirstCommonNode(Node head1, Node head2){
if(head1 == null || head2 == null)
return null;
int length_1 = 1;
int length_2 = 1;
Node pHead1 = head1;
Node pHead2 = head2;
while(pHead1.next != null){
length_1 ++;
pHead1 = pHead1.next;
}
while(pHead2.next != null){
length_2 ++;
pHead2 = pHead2.next;
}
if(pHead1 != pHead2) //如果最后一个节点不相同,则直接返回null。
return null;
pHead1 = head1;
pHead2 = head2;
if(length_1>length_2){
while(length_1>length_2){
pHead1 = pHead1.next;
length_1 --;
}
}
else if(length_1 < length_2){
while(length_1 < length_2){
pHead2 = pHead2.next;
length_2 --;
}
}
while(pHead1 != pHead2){
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return pHead1;
}
}