两链表的第一个公共结点

来源:互联网 发布:java sdk安装 编辑:程序博客网 时间:2024/05/22 14:11

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


0 0