Reorder List

来源:互联网 发布:淘宝同行竞争插件 编辑:程序博客网 时间:2024/06/14 16:03

 Givena singly linked list LL0L1→…→Ln-1Ln,
reorder it to: 
L0LnL1Ln-1L2Ln-2→…

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

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

思路:小技巧就是把链表拆车两段,后面的reverse,然后两个链表重新合并。里面考的基础知识比较多,比如如何拆两端,如何reverse一个list,如何合并两个链表。

class Solution {public:  void reorderList(ListNode *head) {        if(head == NULL || head->next == NULL) {            return;        }                ListNode *slow = head;        ListNode *fast = head;                while (fast->next && fast->next->next) {            slow = slow->next;            fast = fast->next->next;        }                ListNode *secondHead = slow->next;        slow->next = NULL; //这个地方写成==check了一个多小时!!!                secondHead = reverseList(secondHead);        ListNode *firstHead = head;                while (secondHead) {            ListNode *tmp1 = firstHead->next;            ListNode *tmp2 = secondHead->next;            firstHead->next = secondHead;            secondHead->next = tmp1;            firstHead = tmp1;            secondHead = tmp2;        }    }        ListNode* reverseList(ListNode *head) {        if (head == NULL || head->next == NULL) {            return head;        }        ListNode *pre = head;        ListNode *curr = head->next;                while (curr) {            ListNode *tmp = curr->next;            curr->next = pre;            pre = curr;            curr = tmp;        }                head->next = NULL;        return pre;            }};


0 0