【Golang】LeetCode-剑指Offer-面试题52-两个链表的第一个公共节点【两种解法】

题目

输入两个链表,找出它们的第一个公共节点。
公共节点不是指节点的值相同,而是两条链中的节点在同一个内存地址。

如下面的两个链表:
【Golang】LeetCode-剑指Offer-面试题52-两个链表的第一个公共节点【两种解法】_第1张图片

在节点 c1 开始相交。

示例 1:
【Golang】LeetCode-剑指Offer-面试题52-两个链表的第一个公共节点【两种解法】_第2张图片

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA= 2, skipB = 3
输出:Reference of the node with value = 8

输入解释:
相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

注意:

1、如果两个链表没有交点,返回 null.
2、在返回结果后,两个链表仍须保持原有的结构。
3、可假定整个链表结构中没有循环。
4、程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof


解法一:双指针,追及相遇

  • 我们使用两个指针 curA,curB分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历
  • 当 curA 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;
  • 当 curB 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。
  • 当它们相遇时,所指向的结点就是第一个公共结点。

解题思路引用自作者:z1m

–执行时间: 232 ms --消耗内存:6.2 MB

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getIntersectionNode(headA, headB *ListNode) *ListNode {
    curA:=headA
    curB:=headB
    for curA!=curB{
        if curA==nil{
            curA=headA
        }else{
            curA=curA.Next
        }
        if curB==nil{
            curB=headB
        }else{
            curB=curB.Next
        }
    }
    return curA
}

解法二:map记录节点地址

  • 因为公共节点不是指其节点的值相同,而是指其内存地址相同
  • 用Map记录其中一条链中的节点
  • 再遍历另外一条链中的节点,看看在Map中有没有记录就行了

–执行时间: 48 ms --消耗内存:7.4 MB

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getIntersectionNode(headA, headB *ListNode) *ListNode {
    hashmap:=make(map[*ListNode]bool)
    for headA!=nil{
        hashmap[headA]=true
        headA=headA.Next
    }
    for headB!=nil{
        if hashmap[headB]{
            return headB
        }
        headB=headB.Next
    }
    return nil
}

你可能感兴趣的:(LeetCode力扣个人题解,链表,leetcode,go,golang,面试)