先把链表分割成前后两半,然后交叉融合
实践证明,凡是链表相关的题目,都应该当成工程类题目做,局部变量、功能函数什么的随便整,代码长了没关系,关键是清楚,不容易出错。
代码:
1 ListNode *reverseList(ListNode *head) { 2 if (!head) return head; 3 4 ListNode *prev = head; 5 head = head->next; 6 prev->next = NULL; 7 while (head) { 8 ListNode *next = head->next; 9 head->next = prev; 10 prev = head; 11 head = next; 12 } 13 14 return prev; 15 } 16 17 ListNode *mergeList(ListNode *head1, ListNode *head2) { 18 ListNode *next1, *next2; 19 ListNode *head = head1; 20 21 while (head1 && head2) { 22 next1 = head1->next; 23 next2 = head2->next; 24 head1->next = head2; 25 if (next1) 26 head2->next = next1; 27 head1 = next1; 28 head2 = next2; 29 } 30 31 return head; 32 } 33 34 void reorderList(ListNode *head) { 35 if (!head) 36 return; 37 38 ListNode *fast = head; 39 ListNode *slow = head; 40 while (fast && fast->next) { 41 fast = fast->next->next; 42 slow = slow->next; 43 } 44 45 ListNode *head1 = head; 46 ListNode *head2 = reverseList(slow->next); 47 slow->next = NULL; 48 mergeList(head1, head2); 49 }