题目 leetcode 160.
题目链接
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
来源:力扣(LeetCode)
链接:
解答:
先看图
首先需要意识到的一点,链表中若存在公共节点那么后续节点必然也相同!!
并不会出现如下X相交链的情况
只会存在两种情况存在等长链表和非等长链表:
无论两链表是否相交,只需要将链表LA和链表LB的链尾对齐,然后从后向前依次比较节点是否相同即可。
1.从后向前访问的第一节点既不是公共节点则两链表不相交。
2.从后向前访问的公共节点中最后访问的公共节点则为两链表相交的第一个节点。
但单链表想向前遍历节点有点痴人说梦,但是如果将LA+LB和LB+LA的两条轨道拼接起来,此时尾部对齐,从前望后遍历不就能找到公共节点了嘛!
上代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func getIntersectionNode(headA, headB *ListNode) *ListNode {
p1 , p2 := headA, headB
cnt := 0
for p1 != nil && p2 != nil {
if p1 == p2{
return p1
}
p1 = p1.Next
p2 = p2.Next
if cnt < 2 && p1 == nil{
p1 = headB
cnt++
}
if cnt < 2 && p2 == nil{
p2 = headA
cnt++
}
}
return nil
}
时间复杂度 O(m + n)
空间复杂度 O(1)