[leetcode] 【链表】143. Reorder List

来源:互联网 发布:软件开发 杭州 编辑:程序博客网 时间:2024/04/29 07:21

Given a singly linked list LL0L1→…→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→…

必须是在固定空间进行,不能改变节点的值。

题解

 从链表中间把链表断开,分成两部分。后一部分进行翻转,即:L0L1L2→…      LnLn-1Ln-2→…  这样

翻转部分参考:链表翻转

然后两个指针指向两个链表,然后连起来即可。


/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    void reorderList(ListNode* head) {        if(!head||!head->next) return;        ListNode *fast=head,*slow=head,*prev=NULL;        while(fast&&fast->next)        {            prev=slow;            fast=fast->next->next;            slow=slow->next;        }        prev->next=NULL;        slow=reverse(slow);        ListNode *cur=head;        while(cur->next)        {            ListNode *temp=cur->next;            cur->next=slow;            slow=slow->next;            cur->next->next=temp;            cur=temp;        }        cur->next=slow;            }    ListNode* reverse(ListNode *head)    {        if(!head||!head->next) return head;        ListNode *prev=head;        for(ListNode *cur=head->next,*next=cur->next;cur;        prev=cur,cur=next,next=next? next->next:NULL)            cur->next=prev;        head->next=NULL;        return prev;    }};


0 0