#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;
}
}