160. 相交链表 golang

本文深入探讨了链表相交问题的解决方法,通过分析两个链表的长度差异,调整遍历起点,最终确定相交节点。适用于计算机科学领域的数据结构与算法学习。

求两个链表相交

Me


func getIntersectionNode(headA, headB *ListNode) *ListNode{
    if headA == nil {
        return headA
    }
    if headB == nil {
        return headB
    }

    l1 := headA
    l2 := headB

    var a int = 0
    node := l1
    for node != nil {
        a += 1
        node = node.Next
    }

    var b int = 0
    node = l2
    for node != nil {
        b += 1
        node = node.Next
    }

    if a > b {
        num := a-b
        for i:=0; i < num; i ++ {
            l1 = l1.Next
        }
    } else if a < b {
        num := b - a
        for i := 0; i < num; i++ {
            l2 = l2.Next
        }
    }
    for l1 != l2 {
        if l1 == nil {
            return headB
        } else {
            l1 = l1.Next
        }

        if l2 == nil {
            return headA
        } else {
            l2 = l2.Next
        }
    }
    return l1;
}

### C++ 实现相交链表算法 #### 双指针法的时间复杂度分析 为了找到两个单向链表的交叉起始节点,可以采用双指针的方法来解决这个问题。该方法能够达到O(m+n)的时间复杂度,并且只需要常数级别的额外空间开销[^2]。 #### 计算两链表长度差异并调整起点 首先遍历两个链表以获取它们各自的总长度。通过比较这两个长度值,可以让较长的那个链表先前进几步,直到两者剩余未访问部分具有相同的长度为止[^3]。 ```cpp // 获取链表长度函数 int getLength(ListNode *head){ int length = 0; while(head != nullptr){ ++length; head = head->next; } return length; } ``` #### 同步移动双指针寻找交叉点 一旦完成了上述操作,则可以从相同位置开始同步向前推进两个指针;如果存在交叉点,在某一时刻二者会指向同一个地址即为所求的结果;反之则说明不存在公共结点。 ```cpp ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if (!headA || !headB) return NULL; // Calculate lengths of both lists. int lenA = getLength(headA); int lenB = getLength(headB); // Move the pointer on longer list forward by difference in lengths. while (lenA > lenB) { headA = headA->next; --lenA; } while (lenB > lenA) { headB = headB->next; --lenB; } // Advance both pointers until they meet or reach end. while (headA && headB) { if (headA == headB) return headA; headA = headA->next; headB = headB->next; } return NULL; // No intersection found. } ``` 此段代码实现了对于给定的一对可能相交的单链表`headA`和`headB`,利用双指针技巧有效地找到了其首个共同元素的位置或者确认无任何重叠之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值