143. Reorder List

来源:互联网 发布:c盘中windows.old 编辑:程序博客网 时间:2024/06/03 08:17

Given a singly linked list L: L0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-2→…

You must do this in-place without altering the nodes' values.

For example,
Given {1,2,3,4}, reorder it to {1,4,2,3}.


将一个链表重排顺序,排成L0LnL1Ln-1L2Ln-2→…这样的形式。想法是找出链表的中间点,以中间点为分隔点分成两条链表,然后将后面的链表倒转,最后交错合并两个链表即可。


代码:

class Solution{public:void reorderList(ListNode* head) {if(!head || !head->next || !head->next->next) return;ListNode* ptr = head, * mid = head;int size = 0;while(ptr){++size;ptr = ptr->next;}ptr = head;for(int i = 0; i < (size - 1) / 2; ++i){ptr = ptr->next;}mid = ptr->next;ptr->next = NULL;mid = reverseList(mid);mergeList(head, mid);}ListNode* reverseList(ListNode* head){ListNode* tmp, * next = NULL;while(head->next){tmp = head->next;head->next = next;next = head;head = tmp;}head->next = next;return head;}void mergeList(ListNode* head1, ListNode* head2){while(head1 && head2){ListNode* tmp1 = head1->next, * tmp2 = head2->next;head1->next = head2;head2->next = tmp1;head1 = tmp1;head2 = tmp2;}}};


0 0
原创粉丝点击