**Leetcode_reorder-list
2014-03-30 21:04
218 查看
地址:http://oj.leetcode.com/problems/reorder-list/
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
思路:感觉这是一道非常好的题,有比较多基础的知识点。比如两个指针一个步进为一,另一个步进为二来求链表的中间节点,还有就是reverseList是in-place的反转单链表,最后就是把两个长度差小于1的链表锯齿形的merge在一起。
把每个知识点都好好想了一想,这样的题应该多做,打上两颗*.
参考代码:
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}.
思路:感觉这是一道非常好的题,有比较多基础的知识点。比如两个指针一个步进为一,另一个步进为二来求链表的中间节点,还有就是reverseList是in-place的反转单链表,最后就是把两个长度差小于1的链表锯齿形的merge在一起。
把每个知识点都好好想了一想,这样的题应该多做,打上两颗*.
参考代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { ListNode*pre=NULL, *cur=head, *next=NULL; while(cur) { next=cur->next; cur->next=pre; pre=cur; cur=next; } return pre; } void reorderList(ListNode *head) { if(head) { ListNode *p1 = head, *p2 = head, *nxt1 = NULL, *nxt2 = NULL; while(p2 && p2->next) { p1 = p1->next; p2 = p2->next; if(p2) p2 = p2->next; } p2 = p1->next; p1->next = NULL; p1 = head; p2 = reverseList(p2); //merge while(p1 && p2) { nxt1 = p1->next; nxt2 = p2->next; p1->next = p2; p2->next = nxt1; p1 = nxt1; p2 = nxt2; } } } };
//SECOND TRIALclass Solution {private: ListNode* reverseList(ListNode* head) { if(!head || !head->next) return head; ListNode *p = head, *pre = NULL, *nxt = NULL; while(p) { nxt = p->next; p->next = pre; pre = p; p = nxt; } return pre; }public: void reorderList(ListNode *head) { if(!head || !head->next) return; ListNode*p1 = head, *p2 = head, *pre = NULL, *nxt1 = NULL, *nxt2 = NULL; while(p1) { p1 = p1->next; pre = p2; if(p1) { p1 = p1->next; p2 = p2->next; } } p2 = pre->next; pre->next = NULL; p2 = reverseList(p2); p1 = head; while(p1 && p2) { nxt1 = p1->next; nxt2 = p2->next; p1->next = p2; p1 = p2->next = nxt1; p2 = nxt2; } }};
相关文章推荐
- LeetCode-reorder-list
- LeetCode—Reorder List
- leetcode — reorder-list
- leetcode---reorder-list---链表中点、逆转
- LeetCode—Reorder List 解题报告
- leetcode — reorder-list
- LeetCode143—Reorder List
- LeetCode--reorder-list
- Leetcode: reorder-list
- C实现 LeetCode->Reorder List (双指针大法)(单链表是否有环)
- reorder-list(Leetcode)
- LeetCode "Reorder List"
- Leetcode: reorder-list
- LeetCode刷题笔记(链表):reorder-list
- leetcode第8题(reorder-list)
- [LeetCode]题解(python):082-Remove Duplicates from Sorted List II
- Leetcode Reverse Linked List II
- Insertion Sort List - LeetCode 147
- Leetcode NO.206 Reverse Linked List
- leetcode:Sort List(一个链表的归并排序)