思路(借鉴自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; } }