Reorder List问题及解法

来源:互联网 发布:大华网络客户端软件 编辑:程序博客网 时间:2024/05/18 17:59

问题描述:

Given a singly linked list LL0?L1?…?Ln-1?Ln,
reorder it to: L0?Ln?L1?Ln-1?L2?Ln-2?…

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

示例,
Given {1,2,3,4}, reorder it to {1,4,2,3}.


问题分析:

对于此类问题,统计结点数目,并找到中间结点mid,对mid后的结点依次插入即可。

例如

l0,l1,l2,l6,l3,l4,l5这个链表来说,l6是mid,之后就是将l5插入l0和l1之间,l4插入l1和l2之间,l3插入l2和l6之间。


过程详见代码:

/** * 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) {        vector<ListNode*> res;ListNode * temp = head;int num = 0;while (temp){num++;res.emplace_back(temp);temp = temp->next;  }temp = head;for (int i = 1; i <= num / 2; i++){if (temp->next == res[num - i]) return;res[num - i]->next = temp->next;temp->next = res[num - i];temp = res[num - i]->next;res[num - i - 1]->next = NULL;}    }};


原创粉丝点击