您的位置:首页 > 职场人生

60_leetcode_Reorder List

2014-06-20 07:41 295 查看
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}
.

1:特殊情况;2:将链表分成两部分;对第二部分进行发转;2:交叉合并两个链表

ListNode *sortList(ListNode *head)
{
if(head == NULL || head->next == NULL)
{
return head;
}

ListNode* slowNode = head;
ListNode* fastNode = head->next;

while(fastNode && fastNode->next)
{
slowNode = slowNode->next;
fastNode = fastNode->next->next;
}

ListNode* firstNode = head;
ListNode* secondNode = slowNode->next;
slowNode->next = NULL;

firstNode = sortList(firstNode);
secondNode = sortList(secondNode);

head = mergeTwoList(firstNode, secondNode);

return head;
}

ListNode* mergeTwoList(ListNode* head1, ListNode* head2)
{
ListNode* newHead = NULL;
ListNode *index = NULL;

while(head1 && head2)
{
if(head1->val <= head2->val)
{
if(newHead == NULL)
{
newHead = head1;
index = newHead;
}
else
{
index->next = head1;
index = index->next;
}
head1 = head1->next;
}
else
{
if(newHead == NULL)
{
newHead = head2;
index = newHead;
}
else
{
index->next = head2;
index = index->next;
}
head2 = head2->next;
}
}

index->next = (head1 == NULL ? head2 : head1);

return newHead;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息