LeetCode刷题笔记(链表):reorder-list
2018-01-15 21:02
239 查看
转载请注明作者和出处:http://blog.csdn.net/u011475210
代码地址:https://github.com/WordZzzz/Note/tree/master/LeetCode
刷题平台:https://www.nowcoder.com/ta/leetcode
题 库:Leetcode经典编程题
编 者:WordZzzz
题目描述
解题思路
C版代码实现
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-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}.
系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~
完的汪(∪。∪)。。。zzz
代码地址:https://github.com/WordZzzz/Note/tree/master/LeetCode
刷题平台:https://www.nowcoder.com/ta/leetcode
题 库:Leetcode经典编程题
编 者:WordZzzz
题目描述
解题思路
C版代码实现
题目描述
Given a singly linked list L: L 0→L 1→…→L n-1→L n,reorder it to: L 0→L n →L 1→L n-1→L 2→L n-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}.
解题思路
要求in-place,所以不能使用辅助空间。可以采用快慢指针先找到中间点,将原列表分成两个部分,然后再将后半部分反转链表,最后再根据题目规则一前一后合并成一个链表。C++版代码实现
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *getMiddle(ListNode *head){ ListNode *fast = head; ListNode *slow = head; while(fast->next != NULL && fast->next->next != NULL){ slow = slow->next; fast = fast->next->next; } return slow; } ListNode *reverseList(ListNode *head){ ListNode *pReversedHead = NULL; ListNode *pNode = head; ListNode *pPrev = NULL; while(pNode != NULL){ ListNode *pNext = pNode->next; if(pNext == NULL) pReversedHead = pNode; pNode->next = pPrev; pPrev = pNode; pNode = pNext; } return pReversedHead; } void mergeList(ListNode *left, ListNode *right){ while(left != NULL && right != NULL){ ListNode *curLeft = left->next; ListNode *curRight = right->next; left->next = right; right->next = curLeft; left = curLeft; right = curRight; } } void reorderList(ListNode *head) { if(head == NULL || head->next == NULL) return ; ListNode *middle = getMiddle(head); ListNode *right = reverseList(middle->next); middle->next = NULL; ListNode *left = head; mergeList(left, right); } };
系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~
完的汪(∪。∪)。。。zzz
相关文章推荐
- LeetCode刷题笔记(链表):linked-list-cycle-ii
- LeetCode刷题笔记(链表):copy-list-with-random-pointer
- LeetCode刷题笔记(链表):rotate-list
- leetcode---reorder-list---链表中点、逆转
- LeetCode刷题笔记(链表):convert-sorted-list-to-binary-search-tree
- C实现 LeetCode->Reorder List (双指针大法)(单链表是否有环)
- LeetCode刷题笔记(链表):reverse-linked-list-ii
- LeetCode刷题笔记(链表):partition-list
- LeetCode刷题笔记(链表):remove-duplicates-from-sorted-list
- LeetCode刷题笔记(链表):remove-nth-node-from-end-of-list
- LeetCode刷题笔记(链表):remove-duplicates-from-sorted-list-ii
- LeetCode刷题笔记(链表):sort-list
- LeetCode刷题笔记(链表):linked-list-cycle
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
- leetcode:单链表之Reverse Linked List II
- leetcode_c++:链表:Odd Even Linked List(328)
- [LeetCode] Reverse Linked List II 倒置链表之二
- 【LeetCode-面试算法经典-Java实现】【138-Copy List with Random Pointer(拷贝有随机指针的单链表)】
- LeetCode:Palindrome Linked List(回文链表)
- 【LeetCode】Sort List 链表排序- Medium ++(Merge&Quick Sort)