/*
* 面试题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;
}
}
面试题52:两个链表的第一个公共节点
最新推荐文章于 2020-04-01 22:20:20 发布