题解 | 两个链表的第一个公共结点

import java.util.*;
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
/***
 * 最简单的做法当时然用一个map,遍历一个链表放入map,遍历另外一个的时候看看map里有没有,但是这个空间复杂度不是O1
 * 想要满足空间复杂度为O1按照之前的总结,就得双指针,但是双指针怎么指呢? 想破头也想不到,没想到啊没想到
 * 看了答案才发现 a+b = b+a 构成两个新的链表,这两个新的链表长度还一样,就能用双指针了,这谁想得到......
 * 这种题目没有意义!看过答案的恍然大悟,没看过的,想破头你也想不到
 *
 */
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode slow = pHead1;
        ListNode fast = pHead2;
        if (pHead1 == null || pHead2 == null) {
            return null;
        }
        boolean finishedOne = false;
        while (slow != null) {
            if (fast == slow) {
                return fast;
            }
            if (slow.next == null && !finishedOne) {
                slow = pHead2;
                finishedOne = true;
            } else {
                slow = slow.next;
            }
            if (fast.next == null) {
                fast = pHead1;
            } else {
                fast = fast.next;
            }
        }
        return null;
    }
}

感觉这种题目没有意义,虽然知道O1的空间复杂度,且需要遍历求解相同节点,最简单的方式是map,但是要求O1的空间复杂度,就想到双指针,可是这个双指针也不知道如何双指针去遍历啊。

直到看到答案,a+b = b+a,你说你不看答案,谁想得到这么处理............ 真服了

全部评论

相关推荐

01-03 18:26
山东大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务