#160. 相交链表
思路(借鉴自belinda)
一种比较巧妙的方式是,分别为链表A和链表B设置指针A和指针B,然后开始遍历链表,如果遍历完当前链表,则将指针指向另外一个链表的头部继续遍历,直至两个指针相遇。
最终两个指针分别走过的路径为:
指针A :a+c+b
指针B :b+c+a
明显 a+c+b = b+c+a,因而如果两个链表相交,则指针A和指针B必定在相交结点相遇。

复杂度分析
- 时间复杂度 : O(m+n)。
- 空间复杂度 : O(1)。
备注
分析完了题目,找到解题方法后,还要注意几种特殊样例,比如其中一个链表为空,比如无相交等等
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null||headB==null)
return null;
ListNode pa=headA;
ListNode pb=headB;
while(pa!=pb)
{
if(pa!=null)//如果写pa.next!=null,在两个完全不相交的链表的样例下会死循环
pa=pa.next;
else
pa=headB;
if(pb!=null)
pb=pb.next;
else
pb=headA;
}
return pa;
}
}
本文介绍了一种解决相交链表问题的巧妙方法,通过设置双指针遍历两个链表,即使链表长度不同也能准确找出相交节点。这种方法的时间复杂度为O(m+n),空间复杂度为O(1),适用于各种链表相交情况。

2911

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



