
思路:双指针法

一种比较巧妙的方式是,分别为链表A和链表B设置指针A和指针B,然后开始遍历链表,如果遍历完当前链表,则将指针指向另外一个链表的头部继续遍历,直至两个指针相遇。
最终两个指针分别走过的路径为:
指针A : a+c+b
指针B : b+c+a
明显 a+c+b = b+c+a,因而如果两个链表相交,则指针A和指针B必定在相交结点相遇
——时间复杂度 : O(m+n) 其中m和n分别为两个指针的长度
——空间复杂度 : O(1)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode pA = headA, pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
本文详细介绍了使用双指针法解决寻找两个链表相交节点的问题,通过同步移动两个指针,当它们相遇时确定相交点。这种方法的时间复杂度为O(m+n),空间复杂度为O(1)。示例代码展示了具体实现过程。
8万+

被折叠的 条评论
为什么被折叠?



