您的位置:首页 > 其它

leetcode第143题 ( Reorder List),快慢指针的应用

2016-10-27 20:14 537 查看
Given a singly linked list L: L0→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.

For example,

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

代码如下:

void reorderList(ListNode* head) {
// cut list 1->2->3->4->5 ==> list1:1->2 list2:3->4->5
ListNode *fast = head, *slow = nullptr;
while (fast != nullptr && fast->next != nullptr) {
fast = fast->next->next;
slow = slow == nullptr ? head : slow->next;
}
if (slow == nullptr) return;
ListNode *head2 = slow->next;
slow->next = nullptr;
// reverse list2 3->4->5 ==> 5->4->3
slow = fast = head2;
head2 = nullptr;
while (fast != nullptr) {
fast = fast->next;
slow->next = head2;
head2 = slow;
slow = fast;
}
// merge two list list1:1->2 list2:5->4->3 ==> 1->5->2->4->3
slow = fast = head;
while (fast != nullptr && head2 != nullptr) {
fast = fast->next;
slow->next = head2;
head2 = head2->next;
slow->next->next = fast ? fast : head2;
slow = fast;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: