代码随想录刷题随记4
文章目录
- 代码随想录刷题随记4
- 24. 两两交换链表中的节点
- 19.删除链表的倒数第N个节点
- 面试题 02.07. 链表相交
- 142.环形链表II
24. 两两交换链表中的节点
leetcode 链接
没什么技巧,主要考察链表操作的熟练程度
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head==nullptr){return nullptr;}ListNode * virhead=new ListNode(0);virhead->next=head;ListNode * cur=head;ListNode * next=cur->next;ListNode * tmp;ListNode * pre=virhead;while(cur!=nullptr&&next!=nullptr){tmp=next->next;pre->next=next;cur->next=tmp;next->next=cur;pre=cur;cur=tmp;if(cur!=nullptr){next=cur->next;} }return virhead->next;}
};
19.删除链表的倒数第N个节点
leetcode链接
因为是倒数的第n个节点而不是正数的节点,所以为了满足一遍遍历就能找到,可以让快指针和慢指针之间间隔n。快慢指针的经典应用
解题代码如下所示:
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode * virhead=new ListNode(0);virhead->next=head;ListNode * fast;ListNode * slow;fast=virhead;slow =virhead;if(head==nullptr){return nullptr;}while(n>0){if(fast==nullptr){return head;}fast=fast->next;n--;}fast=fast->next;//为了让slow指向要删除的上一个,fast多走一部while(fast!=nullptr){fast=fast->next;slow=slow->next;}slow->next=slow->next->next;return virhead->next;}
};
面试题 02.07. 链表相交
leetcode链接
可以用集合筛选相同的节点即相交节点,但是那样会有额外的空间
采用双指针的方式解决。
首先先求两个链表的长度,找出长链表比短链表长多少,如果两个链表相交,交点一定在这个长度之后。
题解链接
解题代码:
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode * cur1;ListNode * cur2;cur1=headA;cur2=headB;int lengthA=0;int lengthB=0;while(cur1!=nullptr){cur1=cur1->next;lengthA++;}while(cur2!=nullptr){cur2=cur2->next;lengthB++;}if(lengthA==0||lengthB==0)return nullptr;int dif=abs(lengthA-lengthB);lengthA>=lengthB? cur1=headA:cur1=headB;lengthA>=lengthB? cur2=headB:cur2=headA;while(dif>0){cur1=cur1->next;dif--;}while(cur1!=nullptr&&cur2!=nullptr){if(cur1==cur2){return cur1;}cur1=cur1->next;cur2=cur2->next;}return nullptr;}
};
142.环形链表II
leetcode题目链接
主要是如何找到入环节点的那部分的数学推导需要仔细思考一下
解题思路
解题代码
要注意fast边界条件的判断是fast和fast->next都不为空
class Solution {
public:ListNode *detectCycle(ListNode *head) {if(head==nullptr){return nullptr;}ListNode * fast=head;ListNode * slow=head;while(fast!=nullptr&&fast->next!=nullptr){fast=fast->next->next;slow=slow->next;if(fast==slow){break;}}if(fast==nullptr||fast->next==nullptr){return nullptr;}fast=head;while(fast!=slow){fast=fast->next;slow=slow->next;}return fast;}
};