LinkedListNode* mergeLists(LinkedListNode* a, LinkedListNode *b){ // assumes length a >= length b LinkedListNode *curNode=a, *nextNode=b, *nextNextNode; while(curNode != NULL && nextNode!=NULL){ nextNextNode = curNode->next; curNode->next = nextNode; curNode = nextNode; nextNode = nextNextNode; } return a; } LinkedListNode* reverseList(LinkedListNode* a){ LinkedListNode *head = NULL, *curNode=a, *nextNode; while(curNode!=NULL){ nextNode = curNode->next; curNode->next = head; head = curNode; curNode = nextNode; } return head; } LinkedListNode* getLowerMiddleNode(LinkedListNode* a){ LinkedListNode *singleJump=a, *doubleJump = a; while(doubleJump->next != NULL && doubleJump->next->next != NULL){ singleJump = singleJump->next; doubleJump = doubleJump->next->next; } return singleJump; } LinkedListNode* reverseZigZagMerge(LinkedListNode* a){ if(a == NULL) return NULL; LinkedListNode *lowerMiddelNode = getLowerMiddleNode(a); LinkedListNode *secondHalf = lowerMiddelNode->next; lowerMiddelNode->next = NULL; return mergeLists(a,reverseList(secondHalf)); }