题目描述
输入两个链表,找出它们的第一个公共结点。
思路:利用列表
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
# write code here
list1=[]
node1=pHead1
node2=pHead2
while node1:
list1.append(node1.val)
node1=node1.next
while node2:
if node2.val in list1:
return node2
else:
node2=node2.next
思路二:
假定:List1长度: a+n,List2长度:b+n, 且 a<b
那么,p1会先到链表尾部,这时p2走到a+n位置,将p1换成List2头部。
接着,p2 再走b+n-(n+a) =b-a步到链表尾部,这时p1也走到List2的b-a位置,还差a步就到可能的第一个公共节点。
将p2换成 List1头部,p2走a步也到可能的第一个公共节点。
如果恰好p1==p2,那么p1就是第一个公共节点。
或者p1和p2一起走n步到达列表尾部,二者没有公共节点,退出循环。
同理a>=b。
时间复杂度O(n+a+b)
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1==null || pHead2==null)
return null;
ListNode p1=pHead1;
ListNode p2=pHead2;
while(p1!=p2){
p1=(p1==null)?pHead2:p1.next;
p2=(p2==null)?pHead1:p2.next;
}
return p1;
}
}
思路三:利用HashMap,类似python的list
import java.util.HashMap;
import java.util.Map;
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if (pHead1 == null || pHead2 == null) return null;
Map<ListNode, Integer> map = new HashMap<>();
while (pHead1 != null)
{
map.put(pHead1, null);
pHead1 = pHead1.next;
}
while (pHead2 != null)
{
if (map.containsKey(pHead2)) return pHead2;
else pHead2 = pHead2.next;
}
return pHead2;
}
}