Leetcode刷题记录 剑指 Offer II 023. 两个链表的第一个重合节点

给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
在这里插入图片描述
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。

题解思路:自己的思路是若存在链表长度不相等的情况,统计长链表和短链表的长度;采用双指针,先将长链表的指针移动到与短链表指针相同的位置,两个链表左端对齐;再进行结点的循环,来判断两个节点是否为同一个。
自己一开始未通过全部测试例子的原因:忽略了两个链表长度相等时候的情况。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
int getLength(struct ListNode *A){
    int i=0;
    struct ListNode *p=A;
    while(p){
        i++;
        p=p->next;
    }
    return i;
}
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    int i=0;
    int temp;
    int length;
    struct ListNode* p=headA;
    struct ListNode* q=headB;
    /*使用双指针*/
    if(headA == NULL || headB == NULL)
        return NULL;
    int lengthA=getLength(headA);
    int lengthB=getLength(headB);
    if(lengthA>lengthB){
        length=lengthA-lengthB;
        temp=0;
    }
    else{
        length=lengthB-lengthA;
        temp=1;
    }
    for(int j=0;j<length;j++){
        if(temp==0)
            headA=headA->next;
        if(temp==1)
            headB=headB->next;
    }
    while(headA!=NULL && headB!=NULL){
        if(headA==headB){
            return headA;
        }
        headA=headA->next;
        headB=headB->next;
    }
    return NULL;
}

通过查看讨论区的题解,发现的更简单解法,但对自己来说更不好理解。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode* temp_A=headA;
    struct ListNode* temp_B=headB;
    /*一个while循环包含了三个含义:
    1.当headA和headB存在重合节点,但节点数大于1时,使用双指针移动最终temp_A会位于相交节点上;
    2.当headA和headB存在重合节点,且节点数为1时,若不符合循环判定条件,则不进入循环,说明在第一个头结点处重合;
    3.当headA和headB不存在重合节点,使用双指针移动最终tempA和tempB均为NULL时会退出循环;
    */
    while(temp_A != temp_B){
            if(temp_A == NULL){
                temp_A = headB;
            }else{
                temp_A = temp_A->next;
            }
            if(temp_B == NULL){
                temp_B = headA;
            }else{
                temp_B = temp_B->next;
            }
        }
        return temp_A;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值