LeetCode Reorder List
2014-05-20 21:11
232 查看
Q:
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
题意很简单,就是将链表节点顺序按要求改变一下,但是不能单独改变节点的值,也就是说ListNode的val是不能改变的,只有next能改。开始想这还不简单,直接两个循环!结果当然超时。其实可以将这个链表用快慢指针分成两段,将后面一段反转,再依次插入到前面的链表中。
代码:
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}.
题意很简单,就是将链表节点顺序按要求改变一下,但是不能单独改变节点的值,也就是说ListNode的val是不能改变的,只有next能改。开始想这还不简单,直接两个循环!结果当然超时。其实可以将这个链表用快慢指针分成两段,将后面一段反转,再依次插入到前面的链表中。
代码:
class Solution { public: ListNode * reverse(ListNode *head){ ListNode *cur = head, *pre = NULL, *next = NULL; while(cur) { next = cur->next; cur->next = pre; pre = cur; cur = next; } return pre; } void reorderList(ListNode *head) { if(!head)return; ListNode *temp = head; ListNode *p1 = head; ListNode *p2 = head; while(p2) { temp = p1; p1 = p1->next; p2 = p2->next; if(p2) p2 = p2->next; } temp->next = NULL; p2 = reverse(p1); p1 = head; ListNode * p = p1; while(p1 && p2) { ListNode * curNext = p1->next; p1->next = p2; p2 = p2->next; p1->next->next = curNext; p = p1; p1 = curNext; } if(p2)p->next->next = p2; } };
相关文章推荐
- [Leetcode]#143 Reorder List
- LeetCode---Reorder List
- LeetCode 143 Reorder List
- leetcode:Reorder List
- leetcode之Reorder List
- LeetCode: Reorder List
- leetCode刷题Reorder_list (快速求出链表的中间结点——快慢指针方法)
- Reorder List|leetcode题解
- Leetcode:Reorder List 单链表重排序
- 【Leetcode】Reorder List
- [Leetcode] Reorder list 重排链表
- LeetCode Reorder List
- [leetcode-143]Reorder List(c)
- LeetCode:Reorder List
- LeetCode:Reorder List
- Leetcode Reorder List 链表重排序
- leetcode笔记--Reorder List
- 【LeetCode】Reorder List
- LeetCode-M-Reorder List
- 【LeetCode】Reorder List