两个链表的第一个公共结点 --剑指offer
题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
如果两个有公共结点 那么从这个公共结点往后的所有结点都是一样的
方法一:借用栈(相当于从后往前找) 找第一个不相同的点之前的点
import java.util.*; public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { Stack<ListNode> s1=new Stack<>(); Stack<ListNode> s2=new Stack<>(); while (pHead1 != null){ s1.push(pHead1); pHead1=pHead1.next; } while (pHead2 != null){ s2.push(pHead2); pHead2=pHead2.next; } ListNode result=null; while (!s1.isEmpty() && !s2.isEmpty() && s1.peek() ==s2.peek()){ s1.pop(); result =s2.pop(); } return result; } }
方法2:用两个指针同时往后走 最终两个指针到达相同的结点或者同时到达null
如果两个数组长度相同 第一遍直接找到或者找不到;
如果两个数组长度不相同 第一遍结束的时候两个pHead会在同一位置开始往后找 相当于长度相同的数组
import java.util.*; public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { if(pHead1 == null || pHead2 == null){ return null; } ListNode l1=pHead1,l2=pHead2; while(pHead1 != pHead2){ if(pHead1 != null) pHead1 = pHead1.next; else pHead1=l1; if(pHead2 != null) pHead2 = pHead2.next; else pHead2=l2; } return pHead1; } }