代码随想录算法训练营第四天|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

代码随想录算法训练营第四天|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

  • 24. 两两交换链表中的节点
  • 19.删除链表的倒数第N个节点
  • 面试题 02.07. 链表相交
  • 142.环形链表II

总结:今天的题做的很顺利,有问题可以私聊。用时一个小时。

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

题目链接:24. 两两交换链表中的节点
文章链接
思路:划分出来步骤,很快ac。

代码

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummynode = new ListNode(0);  
        dummynode -> next = head;
        ListNode* cur = dummynode;
        while (cur -> next != NULL and cur -> next -> next != NULL) //下面用到了两个next和三个next,要保证前一项存在
        {
            ListNode* temp = cur -> next;
            ListNode* temp1 = cur -> next -> next -> next;

            cur -> next = cur -> next -> next;
            cur -> next -> next = temp;
            cur -> next -> next -> next = temp1;

            cur = cur -> next -> next;

        }
        return dummynode -> next;
    }
    
};

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

题目链接:19.删除链表的倒数第N个节点
文章链接
状态:知道用双指针的话能很快ac。

思路:一开始没想起来用双指针,看了眼思路很快ac出来。注意C++要释放内存。
代码

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummynode = new ListNode(0);
        dummynode -> next = head;
        ListNode* fast = dummynode;
        ListNode* slow = dummynode;

        while (n-- and fast != NULL)
        {
            fast = fast -> next;
        }
        fast = fast -> next;

        while (fast != NULL)
        {
            fast = fast -> next;
            slow = slow -> next;
        }

        ListNode* tmp = slow -> next;
        slow -> next = slow -> next -> next;
        delete tmp;
        return dummynode -> next;
    }
};

面试题 02.07. 链表相交

题目链接:面试题 02.07. 链表相交
文章链接
状态:花的时间有点久,可以ac。

思路:最后找交点的时候挺秒的,不好想。

代码

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) 
    {
        ListNode* cur1 = headA;
        ListNode* cur2 = headB;
        int len1 = 0, len2 = 0;
        while (cur1 != NULL)
        {
            len1 ++;
            cur1 = cur1 -> next;
        }
        while (cur2 != NULL)
        {
            len2 ++;
            cur2 = cur2 -> next;
        }
        cur1 = headA;
        cur2 = headB;
        if (len1 < len2) swap(len1,len2),swap(cur1,cur2);

        int gap = len1 - len2;
        while (gap--)
        {
            cur1 = cur1 -> next;
        }
        while (cur1 != NULL)
        {
            if (cur1 == cur2) return cur1;
            cur1 = cur1 -> next;
            cur2 = cur2 -> next;
        }
        return NULL;

    }
};

142.环形链表II

题目链接:142.环形链表II
文章链接
状态:之前听卡哥讲的时候听懂了,所以能ac出来。

思路:我这里直接粘贴卡哥的一个公式x = (n - 1) (y + z) + z。

代码

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

你可能感兴趣的:(算法,链表,数据结构)