一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第23天,点击查看活动详情。
前言
力扣第160题 相交链表 如下所示:
一、思路
这一题的题目很长,简单翻译一下就是查找两个链表中相交的节点。为了找到 相交的节点,我们需要解决以下两个问题?
- 如何判断链表是否相交?
- 如果找到相交的节点?
判断两个链表是否相交非常简单,只需要判断两个链表中是否有元素相等。那如何找到相交的节点呢?
我们以题目中的示例一作为例子分析,两个链表如下所示:
我们发现既然要找到相交的节点,可以让两个链表从离相交地方相同距离的地方出发,如下图所示:
为了从相同距离的地方出发,我们可以让 从两链表的头出发,到头之后重新从另一链表出发
- 两链表同时从头出发
A链表遍历到头,B链表还未到头
A重新从B出发
B遍历到头后
A和B同距离出发
既然可以在相交点前同距离出发,那么找到相交节点也不是难事情了。
二、实现
实现代码
实现代码与示例中保持一致:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode pA = headA, pB = headB;
while (pA != pB) {
if (pA == null){
pA = headB;
} else {
pA = pA.next;
}
if (pB == null){
pB = headA;
} else {
pB = pB.next;
}
}
return pA;
}
测试代码
public static void main(String[] args) {
ListNode a1 = new ListNode(4);
ListNode a2 = new ListNode(1);
ListNode a3 = new ListNode(8);
ListNode a4 = new ListNode(4);
ListNode a5 = new ListNode(5);
ListNode b1 = new ListNode(5);
ListNode b2 = new ListNode(6);
ListNode b3 = new ListNode(1);
a1.next = a2;
a2.next = a3;
a3.next = a4;
a4.next = a5;
b1.next = b2;
b2.next = b3;
b3.next = a3;
new Number160().getIntersectionNode(a1, b1);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~