刷题8:找出两个链表的交点
Posted 嗯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题8:找出两个链表的交点相关的知识,希望对你有一定的参考价值。
Leetcode: 160. 相交链表
两种解法:双指针法和哈希表法。
1.双指针法
思路:链表A和B同时出发,链表A走到末尾,跳到B的开头继续走,B走到末尾,同样跳到A继续走,如果A,B不相等,继续执行,如果A,B相等,有两种可能:①A=B=null,A和B都来到了各自的末尾,A,B无交点。②A=B=链表交点,该情况A,B存在交点,这时返回A,B任一节点即可。因此如果两个链表相交,返回的值是两链表第一个交点,如果不相交,返回的是null。
//双指针法
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headA == null) return null;
ListNode A = headA,B = headB;
while(A!= B){
A = A == null?headA:A.next;
B = B == null?headB:B.next;
}
return A;
}
}
2.哈希表法
(1)如果指向链表的指针A或者B任何一个为空,则没有交点,返回null
(2)把链表A所有节点加入先hashset
(3)遍历链表B,在遍历过程中的节点如果在hashset中存在,则说明该节点为公共节点,如果最终遍历完没有节点存在hashset中,两链表不相交,则返回空。
//哈希表法
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) return null;
HashSet<ListNode> set = new HashSet<ListNode>();
while(headA != null){
set.add(headA);
headA = headA.next;
}
while(headB != null){
if(set.contains(headB)){
return headB;
}
headB = headB.next;
}
return null;
}
}
以上是关于刷题8:找出两个链表的交点的主要内容,如果未能解决你的问题,请参考以下文章