难度等级:简单
上一篇算法:
力扣此题地址:
160. 相交链表 - 力扣(Leetcode)
1.题目:两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点 c1 开始相交。
示例 1:
2.解题思路:
1.设置两个头指针PA、PB分别指向链表A、链表B
2.PA遍历链表A,当遍历到链表A尾部时,将headB头指针赋值给PA,PA开始遍历链表B;
3.PB也一样,PB遍历链表B,当遍历到链表B尾部时,将headA头指针赋值给PB,PB开始遍历链表A;
4.如果两个链表中有公共的结点,PA和PB将会在某一处相遇,判断PA和PB是否相等即可;
5.如果两个链表中没有公共的结点,那PA和PB都将会遍历到链表的尾部,链表的尾部为null,那么PA、PB也会相等,但返回的是null。
3.代码实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
class Solution {
ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 边界判断
if (headA == null || headB == null) return null;
// 从两个链表的头结点开始遍历
ListNode pA = headA, pB = headB;
//指针 PA 和 指针 PB 不断向后遍历,直到找到相交点
//如果两个链表不相交,则相当于 null 是它们的相交点,因此不会跳不出 while 循环
while (pA != pB) {
// 指针 PA 一开始在链表 A 上遍历,当走到链表 A 的尾部即 null 时,跳转到链表 B 上
pA = (pA == null ? headB : pA.next);
// 指针 PB 一开始在链表 B 上遍历,当走到链表 B 的尾部即 null 时,跳转到链表 A 上
pB = (pB == null ? headA : pB.next);
}
return pA;
}
}