剑指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 }

当然如果长度相同的话,会直接遍历得到,不需要重头再来。

posted @ 2019-09-10 09:26  chyblogs  阅读(94)  评论(0)    收藏  举报