struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { int Len1, Len2, i; if (headA == NULL || headB == NULL) return NULL; Len1 = GetLengthOfList(headA); Len2 = GetLengthOfList(headB); if (Len1 > Len2) { for (i = 0; i < Len1 - Len2; ++i) headA = headA -> next; } if (Len2 > Len1) { for (i = 0; i < Len2 - Len1; ++i) headB = headB -> next; } while (headA != NULL) { if (headA -> val == headB -> val) return headA; headA = headA -> next; headB = headB -> next; } return NULL; }
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pHead1==nullptr || pHead2==nullptr){ return nullptr; } unsigned int len1 = GetLengthOfList(pHead1); unsigned int len2 = GetLengthOfList(pHead2); int lengthDiff = len1-len2; ListNode* pListHeadLong = pHead1; ListNode* pListHeadShort = pHead2; if(len2>len1){ pListHeadLong = pHead2; pListHeadShort = pHead1; lengthDiff = len2-len1; } for(int i=0;i<lengthDiff;i++){ pListHeadLong=pListHeadLong->next; } while(pListHeadLong!=nullptr && pListHeadShort!=nullptr){ if(pListHeadLong==pListHeadShort){ break; }else{ pListHeadLong=pListHeadLong->next; pListHeadShort=pListHeadShort->next; } } return pListHeadLong; }
struct ListNode* reverseKGroup(struct ListNode* head, int k) { if (k <= 1 || head == NULL || head -> next == NULL) return head; int RoundOfReverse, Len; int i, j; List NewList; Position PtrBeforeEnd, PtrSubBegin, PtrPre, PtrCur, PtrNext; Len = GetLengthOfList(head); if (Len < k) return head; RoundOfReverse = Len / k; PtrPre = head; PtrCur = head -> next; for (i = 0; i < RoundOfReverse; ++i) { PtrSubBegin = PtrPre; for (j = 1; j < k; ++j) { PtrNext = PtrCur -> next; PtrCur -> next = PtrPre; PtrPre = PtrCur; PtrCur = PtrNext; } if (i == 0) NewList = PtrPre; else { PtrBeforeEnd -> next = PtrPre; } PtrSubBegin -> next = PtrCur; PtrBeforeEnd = PtrSubBegin; PtrPre = PtrCur; if (PtrCur != NULL) PtrCur = PtrCur -> next; } return NewList; }