一个包含 n
个元素的线性链表 L = (a_1,a_2,…,a_{n-2},a_{n-1},a_n)
。
现在要对其中的结点进行重新排序,得到一个新链表 L’ = (a_1,a_n,a_2,a_{n-1},a_3,a_{n-2}…)
样例1:
1 2 3
| 输入:1->2->3->4
输出:1->4->2->3
|
样例2:
1 2 3
| 输入:1->2->3->4->5
输出:1->5->2->4->3
|
数据范围
1 < n < 1000
,
1 < a_i < 10000
算法思想
将链表分成左右两部分,右边那一部分进行逆置,然后将两个链表合并
。
前半段是较长的,切断点应该是向上取整,尽可能让前半段长。
选其中一种情况讨论。
step1是合并链表的过程
。
s
节点是需要提前保存的,用来维护q
。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
class Solution { public: void rearrangedList(ListNode* head) { if(!head -> next) return; int len = 0; for(ListNode * p = head; p ; p = p -> next) len++; int left = (len + 1) / 2; ListNode * a = head; for(int i = 0; i < left - 1; i++) a = a -> next; ListNode * b = a -> next, * c = b -> next; a -> next = NULL; b -> next = NULL; while(c){ ListNode * p = c -> next; c -> next = b; b = c; c = p; } ListNode * p = head, * q = b; while(q){ ListNode * s = q -> next; q -> next = p -> next; p -> next = q; p = q -> next; q = s; } } };
|