题解 | #两个链表的第一个公共结点#
两个链表的第一个公共结点
https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ // 采用双指针,因为两个链表前面不同,后面相同 // 假设p1长x1,p2长x2,后面共同长度为y // 我们让p1指针走x1+y+x2,p2指针走x2+y+x1,走相同路程后的下一个点肯定是y的起点也就是第一个公共节点 public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { // 当整体为空时,肯定不会有公共点 if(pHead1 == null || pHead2 == null){ return null; } // 由于第二次大循环必定相遇,所以我们将无公共节点的判断条件设在第二个大循环之后(也就是三个小循环) int count = 0; // 双指针 ListNode node1 = pHead1; ListNode node2 = pHead2; // 整体移动 while(count < 3){ // 相等,返回 if(node1 == node2){ return node1; } // 移动,若到头,转移到另一条链表 node1 = node1.next; if(node1 == null){ node1 = pHead2; // count小循环++,当count=3时,说明有指针开始了第三次循环,则无公共节点 count++; } // 移动,若到头,转移到另一条链表 node2 = node2.next; if(node2 == null){ node2 = pHead1; // count小循环++,当count=3时,说明有指针开始了第三次循环,则无公共节点 count++; } } // 若未相遇,说明无公共节点 return null; } }