题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
方法一:公共节点是在第一链表和第二链表中都存在的节点,该节点往后的子链表在两个链表中是相同的。下面这个图是不可能发生的。
解释:两个链表从某一节点开始,他们的next都指向同一个节点。但由于是单向链表的节点,每个节点只有一个next,因此从第一个公共节点开始,之后他们的所有节点都是重合的,不可能再出现分叉。
自己的代码:公共节点是在第一链表和第二链表中都存在一个节点,该节点往后的子链表在两个链表中是相同的。我这个只是找第一个相同的值。这个改过之后的是正确的。
package test;
class ListNode {
int val;
ListNode next = null;
ListNode (int val){
this.val = val;
}
}
class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1 == null && pHead2 == null){
return null;
}
ListNode p1 = pHead1;
ListNode p2 = pHead2;
while(pHead1 != null){
while(pHead2 != null){
if(pHead1 == pHead2){
return pHead1;
}
pHead2 = pHead2.next;
}
pHead2 = p2;
pHead1 = pHead1.next;
}
return null;
}
}
public class Main{
public static void main(String[] args) {
ListNode p1 = new ListNode(1);
ListNode p2 = new ListNode(2);
ListNode p3 = new ListNode(4);
ListNode p4 = new ListNode(3);
ListNode p5 = new ListNode(5);
p1.next = p2;
p2.next = p3;
p3.next = p4;
p4.next = p5;
ListNode r1 = new ListNode(7);
ListNode r2 = new ListNode(8);
ListNode r3 = new ListNode(9);
ListNode r4 = new ListNode(5);
ListNode r5 = new ListNode(10);
r1.next = r2;
r2.next = r3;
r3.next = r4;
r4.next = r5;
Solution p = new Solution();
ListNode b = p.FindFirstCommonNode(p1, r1);
System.out.println("结果:"+b.val);
}
}