LeetCode基础-链表-找到两个链表的交点

来源:互联网 发布:上瘾网络剧结局是什么 编辑:程序博客网 时间:2024/05/16 11:41

单链表数据结构:

 //Definition for singly-linked list. public class ListNode  {     public int val;     public ListNode next;     public ListNode(int x) { val = x; } }

思路:
注:此算法来自discuss区排第一名的一个比较巧妙的算法。
同时遍历两个链表,当两个结点相同时,循环结束。

  1. 如果两个链表长度相同,且有交点,那么当遇到交点时,循环结束,即找到交点。只需要一次循环。
  2. 如果两个链表长度相同,没有交点,那么当遍历至尾结点的下一个结点时,两个结点都为空,循环结束,返回null。只需要一次循环。
  3. 如果两个链表长度不同,且有交点,那么在第一次遍历时肯定不会在交点处相遇,当更短的链表先到达尾结点时,切换到长链表,而长链表到达尾结点时也切换到短链表,这样两条路线遍历的长度相等,都是“长链表+短链表”的长度,则第二次遍历时即会相遇。
  4. 如果两个链表长度不同,没有交点,那么即使切换线路也永远不会相遇,但是两条路线遍历的长度相等,都是“长链表+短链表”的长度,则第二次遍历时,最终会同时到达各尾结点的下一个结点,即null,循环结束,返回null。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {    //boundary check    if(headA == null || headB == null)     {        return null;    }    ListNode a = headA;    ListNode b = headB;    //如果a,b长度相同, 则第一次遍历时就会结束循环    //如果a,b长度不同,则第二次遍历时会结束循环    while(a != b){        //遍历结束时,互换方向,指向另一个链表的头结点        a = a == null? headB : a.next;        b = b == null? headA : b.next;        }        return a;}
原创粉丝点击