【刷题DAY3】链表|24. 两两交换链表中的节点 19. 删除链表的倒数第 N 个结点 面试题 02.07. 链表相交

1,652 阅读1分钟

24. 两两交换链表中的节点

ListNode* swapPairs(ListNode* head) {
        ListNode* curr = head;
        ListNode* pre = nullptr;
        while(curr){
            ListNode* tmp = curr->next;
            if(!tmp){
                break;
            }
            if(!pre){
                head = tmp;
            }else{
                pre->next = curr->next;
            }
            curr->next = tmp->next;
            tmp->next = curr;

            pre = curr;
            curr = curr->next;
        }
        return head;
    }

19. 删除链表的倒数第 N 个结点

ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummy = new ListNode(0);
        dummy->next= head;
        ListNode* slow = dummy;
        ListNode* fast = dummy;
        while(fast->next){
            if(n<=0){
                slow = slow->next;
            }
            fast = fast->next;
            --n;
            
        }
        slow->next = slow->next->next;
        return dummy->next;
    }

面试题 02.07. 链表相交

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* pA = headA;
        ListNode* pB = headB;
        while(pA && pB){
            pA = pA->next;
            pB = pB->next;
        }
        ListNode* a = headA;
        ListNode* b = headB; 
        if(!pA && pB){
            while(pB){
                pB = pB->next;
                b = b->next;
            }

        }
        if(pA && !pB){
            while(pA){
                pA = pA->next;
                a = a->next;
            }
        }
        while(a && b){
            if(a == b){
                return a;
            }
            a = a->next;
            b = b->next;
        }
        return nullptr;
    }