链表题目

9.输入两个链表,找出第一个公共节点"Y""V""I"
    1.确认链表是否相交
        找到两个链表中最后一个节点
        检测最后一个节点是否相同
        typedef struct ListNode ListNode;
        struct ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            if(headA == NULL || headB){
                return NULL;
            }
            //1.确定是否相交
            ListNode* pTailA = headA;
            ListNode* pTailB = headB;
            
            int sizeA = 1;
            int sizeB = 1;
            //找headA 链表中最后一个节点
            while(pTailA -> next){
                sizeA++;
                pTailA = pTailA -> next;
            }
            
            //headB 链表中最后一个节点
            while(pTailB -> next){
                sizeB++;
                pTailB = pTailB -> next;
            }
            if(pTailA != pTailB){
                return NULL; 
            }
            int gap = sizeA - sizeB;
            ListNode* pCurA = headA;
            ListNode* pCurB = headB;
            
            if(gap > 0){
                while(gap--)
                    pCurA = pCurA -> next;
            }
            else {
                while(gap++){
                    pCurB = pCurB -> next;
                }
            }
            while(pCurA != pCurB){
                两者指向下一个;
            }
            return pCurA;
}
};

10.判断链表是否有环
    typedef struct ListNode  Node;
    bool hasCycle(ListNode *head) {
        Node* pFast = head; 
        Node* pSlow = head;
        while (pFast && pFast->next){
            
            pFast = pFast -> next ->next;
            pSlow = pSlow -> next;
            if(pFast == pSlow){
                return true;
            }
        }
        return fause;
}

11.返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL (结论: 相遇点和头同时指针走,相遇点就是人口点)
    typedef struct ListNode Node;
    ListNode* detectCycle(ListNode *head) {
        Node* pSlow = head;
        Node* pFast = head;
        while(pFast && pFast -> next){
            pFast = pFast -> next -> next;
            pSlow = pSlow -> next;
            if(pFast == pSlow){
                break;
            }
        }
        
        if(pFast == NULL && pFast -> next == NULL){
            return NULL;
        }
        Node* pH = head;
        Node* pM = pFast;
        while(pH != pM){
            pH = pH->next;
            pM = pM->next;
        }
        return pH;
}

12.复杂链表的复制  1->2->3->4->NULL
    struct Node{
        Node* next;
        Node* random;
        int val;
    };
    
    1.在原链表中每个节点后插入值相同的新节点
    2.给新插节点的随机指针域赋值
        Node* BuyNode(int data){
            Node* pNewNode = (int*)malloc(sizeof(Node));
            if(pNewNode == NULL){
                assert(0);
                return 0;
            }
            pNewNode->val = data;
            pNewNode->next = NULL;
            pNewNode->random = NULL;
            
            return pNewNode;
        }
        if(head == NULL){
            return NULL;
        }
        
        //在原链表中每个节点后插入值相同的新节点
        Node* pCur = head;
        Node* pNewNode = null;
        while(pCur){
            
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值