随笔 - 112  文章 - 0  评论 - 0  阅读 - 1426

相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:

 

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

 

复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        //先计算链表长度
        int LenA = 0;
        ListNode *p = headA;
        while(p){
            LenA++;
            p = p->next;
        }
        int LenB = 0;
        ListNode *q = headB;
        while(q){
            LenB++;
            q = q->next;
        }
        //重置指针
        p = headA;
        q = headB;
        //较长的链表先移动指针
        int len = max(LenA,LenB)-min(LenA,LenB);
        if(LenA>LenB){
            while(len--){
                p=p->next;
            }
        }else{
            while(len--){
                q=q->next;
            }
        }
        //同时移动两个指针
        while(p&&q){
            if(p==q){
                return p;
            }
            p=p->next;
            q=q->next;
        }
        return NULL;
    }
};
复制代码

 

posted on   _月生  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示