数据结构之链表 #160. 相交链表

    技术2022-07-11  67

    #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; } }
    Processed: 0.015, SQL: 9