160. 相交链表

//20220411
题目描述:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
题目链接

解题思路:

  • 我们首先设定两个指针,第一个指针指向headA(indexA),第二个指针指向headB(indexB),然后两个指针同时遍历,如果indexA遍历到结尾时等于null,则让indexA指向headB(indexB遍历到结尾也同样操作),然后继续遍历,在indexA==indexB时,返回指向结点(该节点为相交的第一个结点,或者为空)
  • 证明:我们设两个链表相交前的结点数分别为a、b,设相交部分有c个结点,所以indexA遍历到结尾时走的距离为a+c,同理indexB遍历到结尾时走的距离为b+c,当我们在indexA和indexB遍历完成时做indexA=headB或者indexB=headA操作时,二者第二次到达交点时的距离为a+c+b、b+c+a,可以发现,二者相等了!所以进行此操作后,二者必会在第二次到达链表交点时相遇,此时返回就行
    • 另,如果链表无交点且不一样长,二者在进行交换后会同时到达结尾,最终返回的是null;链表一样长,则会同时到达交点或者结尾
  • 实现代码:
/**
 * 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) {
        ListNode index_a = headA;
        ListNode index_b = headB;
        while(index_a==null||index_b==null)return null;

        while(index_a!=index_b){
            index_a = index_a==null?headB:index_a.next;
            index_b = index_b==null?headA:index_b.next;
        }

        return index_a;
    }
}
posted @ 2022-04-11 11:42  醉生梦死_0423  阅读(21)  评论(0编辑  收藏  举报