LeetCode 143. 重排链表(Reorder List)

题目描述

 

给定一个单链表 LL0L1→…→Ln-1Ln ,
将其重新排列后变为: L0LnL1Ln-1L2Ln-2→…

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

给定链表 1->2->3->4, 重新排列为 1->4->2->3.

示例 2:

给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.

 

解题思路

 

大体上分为三步:

  • 首先找到链表的中间位置,从其后面拆开分成两半,保存要反向插入的后半部分的首节点,并把前半部分的最后一个节点的next指针置为NULL
  • 然后将后半部分链表反转,并保存反转后新链表的首节点
  • 最后从反转后的链表首节点开始,依次间隔一个位置插入到前半部分链表中

 

代码

 

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     void reorderList(ListNode* head) {
12         if(head == NULL || head->next == NULL) return;
13         ListNode *left = head, *right = head;
14         while(right){
15             right = right->next;
16             if(right){
17                 right = right->next;
18                 left = left->next;
19             }
20         }
21         right = left->next;
22         left->next = NULL;
23         left = NULL;
24         ListNode *now = right;
25         while(now){
26             right = now->next;
27             now->next = left;
28             left = now;
29             now = right;
30         }
31         now = head;
32         while(left){
33             right = left->next;
34             left->next = now->next;
35             now->next = left;
36             now = left->next;
37             left = right;
38         }
39     }
40 };

 

posted @ 2018-08-09 11:13  FlyingWarrior  阅读(1447)  评论(0编辑  收藏  举报