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

本文提供了四道关于链表操作的题目解决方案,包括两两交换链表中的节点、删除链表的倒数第N个节点、找到两个链表的交点以及检测环形链表。解法分别使用了迭代、双指针和快慢指针等技巧。

1. 题目链接: 24. 两两交换链表中的节点

个人题解如下:迭代解法!

class Solution 
{
public:
    ListNode* swapPairs(ListNode* head) 
    {
        ListNode * dummyHead = new ListNode(0);

        dummyHead->next = head;
        ListNode * temp = dummyHead;

        while ((temp->next != NULL) && (temp->next->next != NULL))
        {
            ListNode * node1 = temp->next;
            ListNode * node2 = temp->next->next;

            temp->next = node2;
            node1->next = node2->next;
            node2->next = node1;

            temp = node1;
        }

        return dummyHead->next;
    }
};

2. 题目链接: 19.删除链表的倒数第N个节点

个人题解如下:双指针法,再在前面添加一个dummy节点,first指针先往前走n步,然后first和second一起往前走,直接first到NULL,此时second就是待删除点的前一个节点。
在这里插入图片描述

class Solution 
{
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) 
    {
        ListNode * dummy = new ListNode(0, head);
        ListNode * first = head;
        ListNode * second = dummy;

        for (int i = 0; i < n; i ++)
        {
            first = first->next;
        }

        while (first)
        {
            first = first->next;
            second = second->next;
        }

        second->next = second->next->next;
        ListNode* ans = dummy->next;
        delete dummy;

        return ans;
    }
};

3. 题目链接: 160.链表相交

个人题解如下:先过遍历headA、headB, 然后让尾部对齐,然后一起往前移,直到相等。

class Solution 
{
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) 
    {
        int len_A = 0;
        int len_B = 0;
        ListNode * cur_A;
        ListNode * cur_B;

        cur_A = headA;
        while (cur_A != NULL)
        {
            len_A ++;
            cur_A = cur_A->next;
        }

        cur_B = headB;
        while (cur_B != NULL)
        {
            len_B ++;
            cur_B = cur_B->next;
        }     

        cur_A = headA;
        cur_B = headB;
        if (len_A > len_B)
        {
            while (len_A > len_B)
            {
                cur_A = cur_A->next;
                len_A --;
            }
        }   
        else if (len_A < len_B)
        {
            while (len_A < len_B)
            {
                cur_B = cur_B->next;
                len_B --;
            }            
        }

        while ((cur_A != NULL) && (cur_B != NULL))
        {
            if (cur_A == cur_B)
            {
                return cur_A; 
            }
            cur_A = cur_A->next;
            cur_B = cur_B->next;
        }

        return NULL;        
    }
};

4. 题目链接: 142.环形链表II

个人题解如下:快慢指针法,快走两步,慢走一步,先判断会不会碰在一起。若碰在一起,慢指针回退到head, 快慢指针同时望前走一步,直到碰面。

class Solution 
{
public:
    ListNode *detectCycle(ListNode *head) 
    {
        ListNode* low = head;
        ListNode* fast = head;
        int find = 0;
        
        while (fast != NULL)
        {
            low = low->next;
            fast = (fast == NULL) ?  NULL: fast->next;
            fast = (fast == NULL) ?  NULL: fast->next;

            if (low == fast)
            {
                find = 1;
                break;
            }
        }

        if (find != 1)
        {
            return NULL;
        }

        low = head;
        while ((low != fast) && (low != NULL) && (fast != NULL))
        {
            low = low->next;
            fast = fast->next;
        }

        return fast;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值