package com.wsy.sword;
import org.w3c.dom.Node;
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class FindFirstCommonNode {
/*
* 输入两个链表,找出它们的第一个公共结点。
*
* 思路:
* 1、链表相等结点后面的结点都应该相等
* 2、先遍历两个链表求出长度len1,len2
* 3、定义两个指针,让长链表的指针先移动abs(len1 - len2)
* 4、继续遍历两个链表,判断结点是否相等
*/
public ListNode findFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1 == null || pHead2 == null) {
return null;
}
int len1 = 0;
int len2 = 0;
ListNode node1 = pHead1;
ListNode node2 = pHead2;
//获取链表长度
while(node1 != null && node2 != null) {
len1++;
len2++;
node1 = node1.next;
node2 = node2.next;
}
//继续遍历长链表追加长度
while(node1 != null) {
len1++;
node1 = node1.next;
}
//继续遍历长链表追加长度
while(node2 != null) {
len2++;
node2 = node2.next;
}
//将长链表的指针移动长度差
node1 = pHead1;
node2 = pHead2;
if(len1 > len2) {
for (int i = 0; i < len1 - len2; i++) {
node1 = node1.next;
}
}else {
for (int i = 0; i < len2 - len1; i++) {
node2 = node2.next;
}
}
//判断链表中是否存在相交结点
while(node1 != null || node2 != null) {
if(node1 == node2) {
return node1;
}
node1 = node1.next;
node2 = node2.next;
}
return null;
}
}
两个链表的第一个公共结点
最新推荐文章于 2022-07-06 18:10:39 发布