两链表的第一个公共结点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MMChinaMM/article/details/52190364

声明:本片文章为阅读何海涛网易日志后,自己用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;
	}

}


猜你喜欢

转载自blog.csdn.net/MMChinaMM/article/details/52190364