美文网首页
剑指 Offer 52 两个链表的第一个公共节点

剑指 Offer 52 两个链表的第一个公共节点

作者: itbird01 | 来源:发表于2021-12-26 22:30 被阅读0次
题目.png

题意:输入两个链表,找出它们的第一个公共节点。

解题思路

解法1:
1.刚开始看题,很容易被绕晕,明明看用例,第一个是1相同,为什么用例结果是8呢?经过仔细看题分析,发现说的是内存地址和val都相同,所以这样的话,问题就很简单了
2.最简单的解法,双层while循环,我们针对于headA每个节点,去遍历headB,是否节点相等(注意此处是指headA == headB),如果存在这样的节点,则直接返回
解法2:
我们使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 node2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。
这样,当它们相遇时,所指向的结点就是第一个公共结点。

解题遇到的问题

后续需要总结学习的知识点

##解法1
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        while (headA != null) {
            ListNode temp = headB;
            while (temp != null) {
                if (headA == temp) {
                    return headA;
                }
                temp = temp.next;
            }
            headA = headA.next;
        }
        return null;
    }

    public class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
            next = null;
        }
    }
}

##解法2
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode pa = headA, pb = headB;
        while (pa != pb) {
            pa = pa == null ? headB : headA.next;
            pb = pb == null ? headA : headB.next;
        }
        return pa;
    }

    public class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
            next = null;
        }
    }
}

相关文章

网友评论

      本文标题:剑指 Offer 52 两个链表的第一个公共节点

      本文链接:https://www.haomeiwen.com/subject/qnwqqrtx.html