LeetCode 160. 相交链表

发布时间 2023-05-06 16:02:34作者: 小星code

题目链接:LeetCode 160. 相交链表
题意:本题是让找出两个相交的链表的交点,并返回。
解题思路:
方法一:
由于A,B两条链表的长度是未知的,长度不一定相同,但是两个链表的后半段是相交的,也就是说两条链表的后半段的某一部分是相同的,
因此我们可以求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如下图:

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。
否则循环退出返回空指针。

完整代码如下:

func getIntersectionNode(headA, headB *ListNode) *ListNode {
    curA := headA
    curB := headB
    lenA, lenB := 0, 0
    // 求A,B的长度
    for curA != nil {
        curA = curA.Next
        lenA++
    }
    for curB != nil {
        curB = curB.Next
        lenB++
    }
    var step int
    var fast, slow *ListNode
    // 请求长度差,并且让更长的链表先走相差的长度
    if lenA > lenB {
        step = lenA - lenB
        fast, slow = headA, headB
    } else {
        step = lenB - lenA
        fast, slow = headB, headA
    }
    for i:=0; i < step; i++ {
        fast = fast.Next
    }
    // 遍历两个链表遇到相同则跳出遍历
    for fast != slow {
        fast = fast.Next
        slow = slow.Next
    }
    return fast
}

方法二:
虽然A,B两条链表的长度不一定相同,但是两条链表的长度的总和一定是相等的,因此我们可以使用两个指针,分别遍历A,B两个链表,当两个指针分别走了len(A) + len(B) 步 和 len(B) + len(A) 长度时,两个指针一定相遇,此时相遇的结点就是交点。
完整代码如下:

func getIntersectionNode(headA, headB *ListNode) *ListNode {
    curA := headA
    curB := headB
    for curA != curB{
        if curA != nil{
            curA = curA.Next
        }else{
            curA = headB
        }
        if curB != nil{
            curB = curB.Next
        }else{
            curB = headA
        }
    }
    return curA  
}