第二章 链表04 (补 链表相交 ,环形链表II)

面试题 02.07. 链表相交 ,142.环形链表II

面试题 02.07. 链表相交:

设置工作指针时把两个指针设在一起了。。。

int lengthList(struct ListNode *p){
    int count = 0;
    while(p!=NULL){
        p = p->next;
        count++;
    }
    return count;
}//计算链表长度


struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    int lengthheadA = lengthList(headA);//赋值
    int lengthheadB = lengthList(headB);

    struct ListNode* p1 = headA;//设置工作指针
    struct ListNode* p2 = headB;

    while (lengthheadA > lengthheadB){
        p1 = p1->next;
        lengthheadA--;
    }
    while (lengthheadB > lengthheadA){
        p2 = p2->next;
        lengthheadB--;
    }

    while(p1!=p2){
        if(p1==NULL) return NULL;
        if(p2==NULL) return NULL;
        p1=p1->next;
        p2=p2->next;
    }
    return p1;
}

142.环形链表II:

通过计算得出环形链表入口和相遇点的距离等于头节点到环形链表入口的距离,当找到环形链表入口时,将一个工作指针重新从头节点开始,两工作指针相交时就是链表入口。

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *p1 = head, *p2 = head;
    while (p2 != NULL && p2->next != NULL) {
        p1 = p1->next;               // 慢指针移动一步
        p2 = p2->next->next;        // 快指针移动两步

        if (p1 == p2) {              // 如果快慢指针相遇
            p1 = head;               // 将慢指针重置为头节点
            while (p1 != p2) {       // 再次遍历直到两个工作指针再次相遇
                p1 = p1->next;
                p2 = p2->next;
            }
            return p1;               // 返回环的开始节点
        }
    }
    return NULL;                    // 如果没有环,返回NULL
}

总结:链表确实是有很多细节,越界,虚拟头节点的定义需要注意,环形链表没想到还有方程。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值