看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点: 面试题02.07.链表相交_1 我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置 ,如图: 面试题02.07.链表相交_2 此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。 = NULL) { // 求链表B的长度 lenB++; curB = curB->next; } curA = headA = curA->next; curB = curB->next; } return NULL; } }; 时间复杂度: 空间复杂度 == curB) { curA = curA.next; curB = curB.next; } return curA; };
public ListNode removeNthFromEnd(ListNode head, int n) { ListNode curA = head; ListNode curB = null) {//当第一个指针的下一个节点为空时,该指针指向最后一个节点,而指针curB 走了L-n-1步,即指向该删除节点的前一个节点 curA = curA.next; curB = curB.next; } curB.next = curB.next.next;//将本来指向应当删除节点地址指向应当删除节点的下一个节点的地址 =head.next return head while(curA.next): curA=curA.next curB =curB.next curB.next=curB.next.next
看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点: ? 我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图: ? 此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到焦点。 否则循环退出返回空指针。 = NULL) { // 求链表B的长度 lenB++; curB = curB->next; } curA = headA // 遍历curA 和 curB,遇到相同则直接返回 while (curA ! = curA->next; curB = curB->next; } return NULL; } }; 时间复杂度: 空间复杂度:
# @return the intersected ListNode def getIntersectionNode(self, headA, headB): curA,curB 0,0 while curA is not None: lenA += 1 curA = curA.next while curB is not None: lenB += 1 curB = curB.next curA,curB = headA,headB = curB.next while curB ! = curA: curB = curB.next curA = curA.next return curA /* The solution
= NULL){ curB = curB->next; length_b++; } if(curA ! = curB){ return NULL; } curA = headA; curB = headB; if(length_a > length_b){ = curB){ curA = curA->next; curB = curB->next; } return curA; } Language : cpp ; curA = headA; curB = headB; if(curA == NULL || curB == NULL){ return = curB){ curA = curA->next; curB = curB->next; } return curA;
curA、curB走过的长度均为LenA。 此时将curA指向链表 B (长链表)的头节点,curB 不变。两个指针开始第二段遍历,直到 curB 遇到空节点(长链表到达末尾)。 此时 curB 走完整个长链表,走的第二段长度就是差值 L。CurA 从长链表头节点开始,与 curB 同步,其走的第二段长度同样是差值 L。 此时 curA 在长链表 剩余未遍历的节点长度是:LenB - L = LenA 此时将 curB 指向链表A的头节点,即将遍历链表A 的长度为 LenA ,则curA、curB剩余即将遍历的长度即为原本需要比较的长度 = curB) { curA = curA == null ? headB : curA.next; curB = curB == null ? = curB: curA = curA.next if curA else headB curB = curB.next if curB else headA
定义两个指针curA、curB分别从链表A、B开始遍历链表,此时最先遇到空节点(到达末尾)的链表即为短链表。 curA、curB走过的长度均为LenA。 此时将curA指向链表 B (长链表)的头节点,curB 不变。两个指针开始第二段遍历,直到 curB 遇到空节点(长链表到达末尾)。 此时 curB 走完整个长链表,走的第二段长度就是差值 L。 此时 curA 在长链表 剩余未遍历的节点长度是:LenB - L = LenA 此时将 curB 指向链表A的头节点,即将遍历链表A 的长度为 LenA ,则curA、curB剩余即将遍历的长度即为原本需要比较的长度 = curB) { curA = curA == null ? headB : curA.next; curB = curB == null ? = curB: curA = curA.next if curA else headB curB = curB.next if curB else headA
= headB; while (curA) { curB=headB; while (curB) { if (curA == curB) return curA; curB = curB->next; } curA = curA-> 这样如果它们有交点的话,就一定会出现curA==curB,此时这两个指针指向的结点就是第一个交点,返回curA或curB都可。 如果没有交点,那就一直往后走curA不会和curB相等,遍历结束,curA和curB都走到空,返回curA或curB都可。 ->next) { lenB++; curB=curB->next; } //尾不相等,则不相交 if(curA!
*headA, struct ListNode *headB) { int lenA = 0, lenB = 0; struct ListNode* curA = headA, *curB headB; //计算链表长度 while(curA) { ++lenA; curA = curA->next; } while(curB ) { ++lenB; curB = curB->next; } int gap = abs(lenA-lenB); struct ListNode
public ListNode removeNthFromEnd(ListNode head, int n) { ListNode curA = head; ListNode curB = null) {//当第一个指针的下一个节点为空时,该指针指向最后一个节点,而指针curB 走了L-n-1步,即指向该删除节点的前一个节点 curA = curA.next; curB = curB.next; } curB.next = curB.next.next;//将本来指向应当删除节点地址指向应当删除节点的下一个节点的地址 =head.next return head while(curA.next): curA=curA.next curB =curB.next curB.next=curB.next.next 欢迎关注公.众号一起刷题:爱写Bug
; }else if(db==0&&curb==0&&h[curs]>h[s0]){ s0=curs; da=cura; db=curb; }else if(db==0){ s0=curs; da=cura; db=curb; }else if(curb==0){ }else if(da*curb>db*cura){ s0 =curs; da=cura; db=curb; }else if(da*curb==db*cura&&h[curs]>h[s0]){ s0=curs; da=cura; db=curb; } } void fun2(long long s,long long xi){ long long tot=0,cura=0,curb=0,curn=s; for( =0&&tot+adis[curn]<=xi){ tot+=adis[curn]; cura+=adis[curn]; } printf("%d %d\n",cura,curb);
struct ListNode* headA, struct ListNode* headB) { struct ListNode* curA = headA; struct ListNode* curB int lenA = 0; while (curA->next) { ++lenA; curA = curA->next; } int lenB = 0; while (curB ->next) { ++lenB; curB = curB->next; } //不相交 if (curA ! = curB) { return NULL; } int gap = abs(lenA - lenB); //因为我们不知道A长还是B长,所以我们要用假设法,先假设A长,如果不对,再调换一下就行 ->next) { ++lenB; curB = curB->next; } //不相交 if (curA !
){ curB = curB->next; lenB++; } curA = headA; curB = headB; if(lenB > lenA ){// 使得A为长的字符串 swap(lenA,lenB); swap(curA,curB) )return curA; curA = curA->next; curB = curB->next; } return = curB){ curA = curA == NULL ?headB:curA->next; curB = curB == NULL ? headA:curB->next; } return curA; } }; ---- 142.
getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { struct ListNode* curA=headA,*curB while(curA) { lenA++; curA=curA->next; } while(curB) { lenB++ ; curB=curB->next; } if(curA! =curB)/判断是否相交 { return NULL; } int n=abs(lenA-lenB); struct ListNode* longlist
->next = cur; curB = curB->next; } cur = cur->next; } // 处理带环问题 curB->next = nullptr; curS->next = sentinelB->next; ListNode = headB; while(curA->next) curA = curA->next; while(curB->next) curB = curB->next; return curB == curA; } ListNode *getIntersectionNode(ListNode *headA, ListNode *headB ->next){ ++lenB; curB = curB->next; } // 长的链表先走长度查 size_t
= null) { curA = curA.next; lenA++; } while (curB ! = null) { curB = curB.next; lenB++; } int len = lenA - lenB; curA = headA; curB = headB; //2. = -len) { curB = curB.next; count++; } } //3. = curB) { curA = curA.next; curB = curB.next; } if (curA == null) {
int lenA = 1; 找尾结点 while (curA->next) { curA = curA->next; ++lenA; } int lenB = 1; while (curB ->next) { curB = curB->next; ++lenB; } if (curA ! = curB) { return NULL; } struct ListNode* longList = headA, * shortList = headB; if (lenA < lenB ->next) { curB = curB->next; ++lenB; } if (curA ! = curB) { return NULL; } struct ListNode* longList = headA, * shortList = headB; if (lenA < lenB
headB) { int lenA = 0; int lenB = 0; ListNode* curA = headA; ListNode* curB headB; while(curA){ lenA++; curA = curA->next; } while(curB ){ lenB++; curB = curB->next; } // 默认A为更长的 if(lenB > swap(lenA,lenB); } int dis = lenA - lenB; curA = headA; curB )return curA; curA = curA->next; curB = curB->next; } return
ListNode* headA, struct ListNode* headB) { struct ListNode* curA = headA; struct ListNode* curB = headB; while (curA) { curB=headB; while (curB) { if (curA == curB) return curA; curB = curB->next; } curA = curA-> ->next) { lenB++; curB=curB->next; } //尾不相等,则不相交 if(curA! =curB) return NULL; //计算差值 int gap=abs(lenA-lenB); //找出长的那一个 struct ListNode
double &x, double &y, double &z) { double tmpX = x; double temY = y ; double temZ = z; double curB = 0; double calB = atan2(temZ, sqrt(tmpX * tmpX + temY * temY)); int counter = 0; while (abs(curB - calB) * r2d > epsilon && counter < 25) { curB = calB; N = a / sqrt(1 - e * e * sin(curB) * sin (curB)); calB = atan2(temZ + N * e * e * sin(curB), sqrt(tmpX * tmpX + temY * temY)); counter++; } x = atan2(temY, tmpX) * r2d; y = curB * r2d; z = temZ / sin(curB) - N * (1 - e * e); }