【LeetCode笔记】160. 相交链表(Java、链表)

文章目录

  • 题目描述
  • 思路 & 代码

题目描述

  • 感谢这道题,让我更加了解到Dalao们思路的nb
  • 主要是满足空间复杂度O(1)。否则用哈希表不难实现。
    【LeetCode笔记】160. 相交链表(Java、链表)_第1张图片
    【LeetCode笔记】160. 相交链表(Java、链表)_第2张图片

思路 & 代码

  • 有相交结点的情况下,可以找到这么一个等式:
    // 假设链表长度为m,n,起始结点分别对应x,y
    // 那么有 m + y = n + x,就是走完一轮后交换着链表走,双指针能同时达到第一个起点
  • 由此,我们可以开始写代码了。
  • 每个指针,要么走m + n的路程(不相交),要么走 m + y 的路程(相交)
/**
 * 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 forA = headA, forB = headB;
        boolean flag = false;
        // 假设链表长度为m,n,起始结点分别对应x,y
        // 那么有 m + y = n + x,就是走完一轮后交换着链表走,双指针能同时达到第一个起点
        while(true){
            // 走完 m + n的路程,还是没找到的情况
            if(forA == null && forB == null && flag){
                return null;
            }
            // 两种交换
            if(forA == null){
                forA = headB;
                flag = true;
            }
            if(forB == null){
                forB = headA;
            }
            if(forA == forB){
                return forA;
            }
            forA = forA.next;
            forB = forB.next;
        }
    }
}

你可能感兴趣的:(LeetCode要每天都刷噢,java,链表,leetcode)