达人室内设计网官网入口温州网站排名优化
达人室内设计网官网入口,温州网站排名优化,厦门+外贸公司做网站,手机网站制作解决方案刷题的第四天#xff0c;希望自己能够不断坚持下去#xff0c;迎来蜕变。#x1f600;#x1f600;#x1f600; 刷题语言#xff1a;C / Python Day4 任务 ● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II
1 …刷题的第四天希望自己能够不断坚持下去迎来蜕变。 刷题语言C / Python Day4 任务 ● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II
1 两两交换链表中的节点 用虚拟头结点
伪代码
dummyhead-next head; // 设置一个虚拟头结点
cur dummyhead;// 将虚拟头结点指向head
while (cur-next ! NULL cur-next-next ! NULL) // 注意不能颠倒顺序空指针不能访问-next
{tmp1 cur-next; // 记录临时节点tmp2 cur-next-next-next;// 记录临时节点cur-next cur-next-next; // 步骤一cur-next-next tmp1; // 步骤二tmp1-next tmp2; // 步骤三cur cur-next-next; // cur移动两位
}
return dummyhead-next;时间复杂度 O ( n ) O(n) O(n) 空间复杂度 O ( 1 ) O(1) O(1)
C:
class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode* dummyhead new ListNode(0);dummyhead-next head;ListNode* cur dummyhead;while (cur-next ! NULL cur-next-next ! NULL){ListNode* tmp1 cur-next;ListNode* tmp2 cur-next-next-next;cur-next cur-next-next;cur-next-next tmp1;tmp1-next tmp2;cur cur-next-next;}head dummyhead-next;delete dummyhead;return dummyhead-next;}
};Python
class Solution(object):def swapPairs(self, head)::type head: ListNode:rtype: ListNodedummyhead ListNode(nexthead)cur dummyheadwhile cur.next ! None and cur.next.next ! None:tmp1 cur.nexttmp2 cur.next.next.nextcur.next cur.next.nextcur.next.next tmp1tmp1.next tmp2cur cur.next.nextreturn dummyhead.next2 删除链表的倒数第N个节点 思路 要删除倒数第n个节点,让fast移动n步然后让fast和slow同时移动直到fast指向链表末尾。删掉slow所指向的节点链表的删除操作应该是要让删的前一个节点指向要删节点的后一个节点所以应该先让fast移动n1步这样slow慢指针最后就是指向要删节点的前一个节点 伪代码
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;C
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyhead new ListNode(0);dummyhead-next head;ListNode* fast dummyhead;ListNode* slow dummyhead;n;while (n-- fast ! NULL){fast fast-next;}while (fast ! NULL){fast fast-next;slow slow-next;}ListNode* tmp slow-next;slow-next slow-next-next;delete tmp;return dummyhead-next;}
};Python:
class Solution(object):def removeNthFromEnd(self, head, n)::type head: ListNode:type n: int:rtype: ListNodedummyhead ListNode(nexthead)fast dummyheadslow dummyheadn 1while n and fast ! None:n - 1fast fast.nextwhile fast ! None:slow slow.nextfast fast.nextslow.next slow.next.nextreturn dummyhead.next3 链表相交 思路 求两个链表交点的指针交点不是数值相等是指针相等 求出两个链表的长度并求出两个链表长度的差值让curA移动到和curB 末尾对齐的位置 此时比较curA和curB是否相同如果不相同同时向后移动curA和curB如果遇到curA curB则找到交点否则循环退出返回空指针。 伪代码 1curA headA; curB headB; 2求AB链表的长度 3curA headA; curB headB; 4保证A长度是最大的 5让curA移动到和curB 末尾对齐的位置 6比较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;int lenB 0;while (curA ! NULL)// 求链表A的长度{lenA;curA curA-next;}while (curB ! NULL)// 求链表B的长度{lenB;curB curB-next;}curA headA;curB headB;if (lenA lenB)// 让curA为最长链表的头lenA为其长度{swap(lenA, lenB);swap(curA, curB);}int gap lenA - lenB;// 求长度差// 让curA和curB在同一起点上末尾位置对齐while(gap--){curA curA-next;}while (curA ! NULL){ // 遍历curA 和 curB遇到相同则直接返回if (curA curB){return curA;}curA curA-next;curB curB-next;}return NULL;}
};Python
class Solution(object):def getIntersectionNode(self, headA, headB)::type head1, head1: ListNode:rtype: ListNodecurA headAcurB headBlenA 0lenB 0while curA ! None:lenA 1curA curA.nextwhile curB ! None:lenB 1curB curB.nextcurA headAcurB headBif lenA lenB:lenA, lenB lenB, lenAcurA, curB curB, curAgap lenA - lenBfor i in range(gap):curA curA.nextwhile curA ! None:if curA curB:return curAcurA curA.nextcurB curB.nextreturn None4 环形链表II 给定一个链表返回链表开始入环的第一个节点。 如果链表无环则返回 null。 为了表示给定链表中的环使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始。 如果 pos 是 -1则在该链表中没有环。 思路 1判断链表是否有环 2如果有环如何找到这个环的入口 如何判断链表有环 使用快慢指针法定义fast和slow指针从头节点出发快指针每次移动两个节点慢指针每次移动一个节点如果fast和slow指针在途中相遇说明这个链表有环 如果有环如何找到这个环的入口 相遇时slow指针走过的节点数 x y x y xy fast指针走过的节点数 x y n ( y z ) x y n(y z) xyn(yz) ( x y ) ∗ 2 x y n ( y z ) (xy)*2x y n(y z) (xy)∗2xyn(yz) x n ( y z ) − y xn(yz)-y xn(yz)−y 找环形的入口就是求xx表示头结点到环形入口节点的的距离。 x ( n − 1 ) ( y z ) z x(n-1)(yz)z x(n−1)(yz)z注意这里n一定是大于等于1的因为 fast指针至少要多走一圈才能相遇slow指针 当 n为1的时候公式就化解为 x z x z xz 从头结点出发一个指针从相遇节点 也出发一个指针这两个指针每次只走一个节点 那么当这两个指针相遇的时候就是 环形入口的节点。 在相遇节点处定义一个指针index1在头结点处定一个指针index2。让index1和index2同时移动每次移动一个节点 那么他们相遇的地方就是 环形入口的节点。 伪代码 1fast和slow指针指向头节点 2循环当fast和fast-next等于NULL循环终止。slow走一步,fast走两步 3当两指针相遇index1 fast,index2 head。两index同时向后移如果相等返回环的入口 4找不到返回NULL C
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* fast head; // fast和slow指针指向头节点ListNode* slow head;while (fast ! NULL fast-next ! NULL) // 循环当fast和fast-next等于NULL循环终止{slow slow-next; // slow走一步fast fast-next-next;// fast走两步if (slow fast) // 当两指针相遇index1 fast,index2 head。两index同时向后移如果相等返回环的入口{ListNode* index1 fast;ListNode* index2 head;while (index1 ! index2){index1 index1-next;index2 index2-next;}return index1;}}return NULL;}
};Python
class Solution(object):def detectCycle(self, head)::type head: ListNode:rtype: ListNodefast headslow headwhile fast ! None and fast.next ! None:slow slow.nextfast fast.next.nextif slow fast:index1 fastindex2 headwhile index1 ! index2:index1 index1.nextindex2 index2.nextreturn index2return None鼓励坚持四天的自己
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89509.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!