代码随想录算法训练营第四天 | 23.两两交换链表中的节点 19.删除链表的倒数第N个节点 链表相交 142.环形链表II
23.两两交换链表中的两个节点
- 时间复杂度 o(n)
- 空间复杂度 o(1)
tips: 画图,并将每一步操作用伪代码写出来,然后将代码理顺可以避免修改代码的麻烦
初始化的时候就要将previous初始化为current的前一个节点,这样可以保证循环的第一步满足循环要求
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
// 定义虚拟头节点
ListNode * dummy = new ListNode();
dummy->next = head;
// 初始化current指向第一个节点也就是头节点,previous指向current的前一个节点
ListNode * current = head, * previous = dummy;
// 如果current不为空执行循环
while(current) {
// 定义一个节点保存带交换的两个节点的前一个节点
ListNode * temp = previous;
// previous指向带交换的两个节点中第一个节点
previous = current;
// 如果current的下一个节点不为空,那么current指向待交换的两个节点中第二个节点
if(current->next) {
current = current -> next;
// 交换两个节点
previous->next = current->next;
current->next = previous;
temp->next = current;
} else {
// 如果current的下一个节点为空那么只有一个待交换节点,此时返回
return dummy->next;
}
// current指向下一组待交换的两个节点中的第一个节点
current = previous->next;
}
return dummy->next;
}
};
19.删除链表的倒数第N个节点
- 时间复杂度 o(n)
- 空间复杂度 o(1)
tips: 这里再删除的时候不需要判断slow是否为空因为最开始的时候slow指向dummy,slow->next指向head,两者都不为空,在有fast作为先导的情况下,slow不可能为空,slow的next也不可能为空
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode * dummy = new ListNode;
dummy->next = head;
ListNode * fast = dummy;
ListNode * slow = dummy;
while(n-- && fast) fast = fast->next;
while(fast->next) {
// 慢指针出发
fast = fast->next;
slow = slow->next;
}
ListNode *temp = slow->next;
slow->next = slow->next->next;
delete temp;
return dummy->next;
}
};
面试题02.07链表相交
- 时间复杂度 o(n)
- 空间复杂度 o(1)
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode * curr_a = headA, * curr_b = headB;
while(curr_a != curr_b) {
if(curr_a) {
curr_a = curr_a->next;
} else {
curr_a = headB;
}
if(curr_b) {
curr_b = curr_b->next;
} else {
curr_b = headA;
}
}
return curr_a;
}
};
142.环形链表II
题目链接 文章讲解 视频讲解
- 时间复杂度 o(n)
- 空间复杂度 o(1)
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode * fast = head, *slow = head;
if(!head) return nullptr;
while(fast->next) {
fast = fast->next;
if(fast->next) fast = fast->next;
else return nullptr;
slow = slow->next;
if(slow == fast) break;
}
if(!fast->next) return nullptr;
ListNode * current = head;
while(current != fast) {
current = current->next;
fast = fast->next;
}
return fast;
}
};