leetcode: Reorder List
2014-04-22 13:18
369 查看
问题: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.将两个列表合并
注意点:第一步中前面一半链表最后一个节点的next要置空
第二步中链表逆序之后最后一个节点的next要置空
第三步中前面一半链表的长度小于等于后面一半链表的长度
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reorderList(ListNode *head) {
if(head == NULL || head->next == NULL) return head;
ListNode *QuickNode = head, *SlowNode = head, *tail = NULL;
while(QuickNode != NULL && QuickNode->next != NULL){
tail = SlowNode;
SlowNode = SlowNode->next;
QuickNode = QuickNode->next->next;
}
tail->next = NULL;
reverseList(SlowNode);
ListNode *p = head;
tail = NULL;
while(p != NULL && SlowNode != NULL){
tail = SlowNode;
ListNode *quicktemp = p->next;
ListNode *slowtemp = SlowNode->next;
SlowNode->next = p->next;
p->next = SlowNode;
p = quicktemp;
SlowNode = slowtemp;
}
if (SlowNode != NULL)
tail->next = SlowNode;
return head;
}
void reverseList(ListNode* &head){
if(head == NULL || head->next == NULL) return ;
ListNode *pre = head,*CurrentNode = head->next;
while(CurrentNode != NULL){
ListNode *postNode = CurrentNode->next;
CurrentNode->next = pre;
pre = CurrentNode;
CurrentNode = postNode;
}
head->next = NULL;
head = pre;
}
};
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}.
解决方案:1.通过快慢指针找到链表的中点,将链表分成两份
2.对后半部分链表进行逆序
3.将两个列表合并
注意点:第一步中前面一半链表最后一个节点的next要置空
第二步中链表逆序之后最后一个节点的next要置空
第三步中前面一半链表的长度小于等于后面一半链表的长度
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reorderList(ListNode *head) {
if(head == NULL || head->next == NULL) return head;
ListNode *QuickNode = head, *SlowNode = head, *tail = NULL;
while(QuickNode != NULL && QuickNode->next != NULL){
tail = SlowNode;
SlowNode = SlowNode->next;
QuickNode = QuickNode->next->next;
}
tail->next = NULL;
reverseList(SlowNode);
ListNode *p = head;
tail = NULL;
while(p != NULL && SlowNode != NULL){
tail = SlowNode;
ListNode *quicktemp = p->next;
ListNode *slowtemp = SlowNode->next;
SlowNode->next = p->next;
p->next = SlowNode;
p = quicktemp;
SlowNode = slowtemp;
}
if (SlowNode != NULL)
tail->next = SlowNode;
return head;
}
void reverseList(ListNode* &head){
if(head == NULL || head->next == NULL) return ;
ListNode *pre = head,*CurrentNode = head->next;
while(CurrentNode != NULL){
ListNode *postNode = CurrentNode->next;
CurrentNode->next = pre;
pre = CurrentNode;
CurrentNode = postNode;
}
head->next = NULL;
head = pre;
}
};
相关文章推荐
- 【LEETCODE】143- Reorder List [Python]
- [LeetCode] Reorder List
- leetCode No.143 Reorder List
- leetcode--Reorder List
- LeetCode reorder-list
- LeetCode--Reorder List
- leetcode-m-Reorder List
- Leetcode ReorderList
- LeetCode 143 Reorder List
- [LeetCode] Reorder List
- leetcode 之Reorder List(25)
- LeetCode | Reorder List(链表重新排序)
- LeetCode(143) Reorder List
- Reorder List @LeetCode
- leetcode-Reorder List-143
- [leetcode]Reorder List
- leetcode 刷题之路 17 Reorder List
- leetcode Reorder List
- Leetcode Reorder List
- leetcode:Reorder List