代码随想录Day4| LeetCode 24 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

1.LeetCode24 两两交换链表中的节点

dummyhead→2→1→3→

dummyhead->next = head
    cur = dummyhead
    while (cur->next != Null && cur->next ->next != Null) {
        temp = cur->next;/*节点1*/
        temp1 = cur->next->next->next;/*节点3*/
        cur->next = cur->next->next;
        cur->next->next = temp;
        temp->next = temp1;
        cur = cur->next->next;
    }
    return dummyhead->next;

2.LeetCode19 删除链表中倒数第N个节点

关键:找到第N个节点然后进行删除操作

        fast        n=2 n+1

dummyhead

        口→口→口→口→口→Null

                       ↑        ↑

        slow

new node;
fast = dummyhead;
slow = dummyhead;
n++;
while(n-- && fast != Null)
    fast = fast->next;
while( fast != Null)
    fast = fast->next;
    slow = slow->next;
slow->next = slow->next->next;
return dummyhead->next;

3环形链表——这题没有视频搬运代码随想录文字讲解

面试题 02.07. 链表相交

同:160.链表相交

力扣题目链接(opens new window)

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

示例 1:

示例 2:

示例 3:

#思路

简单来说,就是求两个链表交点节点的指针。 这里同学们要注意,交点不是数值相等,而是指针相等。

为了方便举例,假设节点元素数值相等,则节点指针相等。

看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:

面试题02.07.链表相交_1

我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:

面试题02.07.链表相交_2

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。

否则循环退出返回空指针。

C++代码如下:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != NULL) { // 求链表A的长度
            lenA++;
            curA = curA->next;
        }
        while (curB != NULL) { // 求链表B的长度
            lenB++;
            curB = curB->next;
        }
        curA = headA;
        curB = headB;
        // 让curA为最长链表的头,lenA为其长度
        if (lenB > lenA) {
            swap (lenA, lenB);
            swap (curA, curB);
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap--) {
            curA = curA->next;
        }
        // 遍历curA 和 curB,遇到相同则直接返回
        while (curA != NULL) {
            if (curA == curB) {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return NULL;
    }
};
  • 时间复杂度:O(n + m)
  • 空间复杂度:O(1)

4.环形链表

判断环

快慢指针如果相遇就是有环

判断环:fast每次走两个节点;slow每次走一个节点;

为什么快指针一定会遇到慢指针:一定是快指针先进入这个环,然后慢指针才进入这个环,快在追慢的过程,快指针是以什么速度接近慢指针呢。相对于慢指针快指针的速度是每次移一个节点的移动速度。所以他两一定会相遇。

找出环的入口

从起始位置到入口处x,相遇到入口y,y到出口是z。

连接:

slow = x+y

fast = x+y+n*(y+z)

2(x+y) = x+y+n(y+z)

x+y = n(y+z)

x= n(y+z)-y  n至少大于等于1

x=(n-1)(y+z)+z

x=z 你在里面转了几圈无所谓

代码实现

fast = head;
slow = hear
while (fast ! Null && fast->next != Null)
    fast = fast->next->next;
    slow = slow->next
    if (fast == slow) {
        index1 = fast
        index2 = head
        while(index1 != index2) {
            index1 = index1 -> next;
            index2 = index2 ->nexr;
        }
        return index1;
return Null;

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值