ChatGPT 可用网址,仅供交流学习使用,如对您有所帮助,请收藏并推荐给需要的朋友。
https://ckai.xyz
leetcode:
https://leetcode.cn/problems/intersection-of-two-linked-lists...
解题思路:
双指针 如果链表A和链表B长度分别为a和b, 如果两个链表相交,那么公共部分的长度肯定是相等的,假设为c, 那么链表A在公共部分前的长度就是a-c, 同理链表B在公共部分前的长度就是b-c, 于是就有了a+b-c = b+a-c, 也就是说如果l1,l2两个指针分别指向链表A和链表B的头结点,然后同时同速的向右移动,如果移动到空节点,则转移到对方的头结点继续移动,它们俩一定会在相交处相遇。它们俩的运动轨迹正好就是a+b-c = b+a-c, 如果它们没有相交,那么它们一定会在某个时刻同时移动到空节点(nil),此时返回空节点(nil)即可。
func getIntersectionNode(headA, headB *ListNode) *ListNode {
curA,curB := headA,headB
for curA != curB {
if curA == nil { // 如果第一次遍历到链表尾部,就指向另一个链表的头部,继续遍历,这样会抵消长度差。如果没有相交,因为遍历长度相等,最后会是 nil == nil
curA = headB
} else {
curA = curA.Next
}
if curB == nil {
curB = headA
} else {
curB = curB.Next
}
}
return curA
}