剑指offer_两个链表的第一个公共结点
题目描述

方法一:使用一个map存储节点信息,然后一一对比
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 import java.util.*; 11 public class Solution { 12 public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { 13 HashMap<Integer,ListNode> map = new HashMap<>(); 14 ListNode cur = pHead1; 15 while(cur!=null){ 16 map.put(cur.val,cur.next); 17 cur=cur.next; 18 } 19 cur = pHead2; 20 while(cur!=null){ 21 if(map.containsKey(cur.val)&&map.get(cur.val)==cur.next){ 22 break; 23 } 24 cur=cur.next; 25 } 26 return cur; 27 } 28 }
方法二
设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。
当访问链表 A 的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问链表 B 的指针 访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访 问到交点。
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { 12 ListNode cur1 = pHead1; 13 ListNode cur2 = pHead2; 14 while(cur1!=cur2){ 15 cur1 = cur1 == null ? pHead2 : cur1.next; 16 cur2 = cur2 == null ? pHead1 : cur2.next; 17 } 18 return cur1; 19 } 20 }
当然如果长度相同的话,会直接遍历得到,不需要重头再来。

浙公网安备 33010602011771号