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.链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例 1:
示例 2:
示例 3:
#思路
简单来说,就是求两个链表交点节点的指针。 这里同学们要注意,交点不是数值相等,而是指针相等。
为了方便举例,假设节点元素数值相等,则节点指针相等。
看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:
我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:
此时我们就可以比较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;