代码随想录算法训练营day4

代码随想录算法训练营day4

接着链表。

24.两两交换链表中的节点leetcode24 Swap Nodes in Pairs

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
     ListNode*dummyhead=new ListNode(0);
     dummyhead->next=head;
     ListNode*cur=dummyhead;
     while(cur->next!=nullptr&&cur->next->next!=nullptr)
     {
         ListNode*tmp=cur->next;
         ListNode*tmp2=cur->next->next->next;
         cur->next= cur->next->next;
         cur->next->next=tmp;
         cur->next->next->next=tmp2;
         cur=cur->next->next;
     }
        return dummyhead->next;
    }
};

这部分其实想明白了就比较简单了,但一开始比较绕建议画图。虚拟头结点真的是好帮手。

19.删除链表的倒数第N个结点 leetcode19 Remove Nth Node From End of List

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
    ListNode*dummyhead=new ListNode(0);
    dummyhead->next=head;
    ListNode*fast=dummyhead;
    ListNode*slow=dummyhead;
    while(n--&&fast!=NULL)
    {
    fast=fast->next;
    }
    fast=fast->next;
    while(fast!=NULL)
    {
    fast=fast->next;
    slow=slow->next;
    }
    slow->next=slow->next->next;
    return dummyhead->next;
    }
};

这个题目利用了快慢指针,因为是倒数第n个所以快指针先跑n+1,然后再和slow一起动,从而使得slow的下一个就是要删除的第N个结点。

面试题 02.07. 链表相交 Intersection of Two Linked Lists LCCI

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode*curA=headA;
        ListNode*curB=headB;
        int lenA=0,lenB=0;
        while(curA!=NULL)
        {
            lenA++;
            curA=curA->next;
        }
        while(curB!=NULL)
        {
            lenB++;
            curB=curB->next;
        }
        curA=headA;
        curB=headB;
        if(lenB>lenA)
        {
            swap(lenA,lenB);
            swap(curA,curB);
        }
        int gap=lenA-lenB;
        while(gap--)
        {
            curA=curA->next;
        }
        while(curA!=NULL)
        {
            if(curA==curB)
            {
                return curA;
            }
            curA=curA->next;
            curB=curB->next;
        }
        return NULL;
    }
}; 

Tips:在这里需要注意的是先计算长度,然后将其在同一起跑线开始比较。

142.环形链表 leetcode 142 Linked List Cycle II

环形链表看代码随想录讲了一大堆东西要理解的,但这里我觉得只记住几点就能做出这个题,第一个是快慢指针,快指针跑两下,慢指针跑一下如能相遇则证明有环,第二环的入口,由两个指针一个从头一个从相遇点同时出发,相遇就是环的入口。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode*fast=head;
        ListNode*slow=head;
        while(fast!=NULL&&fast->next!=NULL)
        {
            slow=slow->next;
            fast=fast->next->next;
            if(slow==fast)
            {
                ListNode*index1=head;
                ListNode*index2=fast;
                while(index1!=index2)
                {
                    index1=index1->next;
                    index2=index2->next;
                }
                return index2;
            }
        }return NULL;
    }
};

你可能感兴趣的:(算法,链表,leetcode)