您的位置:首页 > 其它

LeetCode "Reorder List"

2014-07-18 04:10 337 查看
Not very hard to figure out the solution: splitting the list into 2 halves; reverse the 2nd half and interleave the two halves.

But it takes some time to code due to a lot of details - majority of them are boudary conditions.

class Solution {
public:
ListNode *findHalf(ListNode *p)
{
ListNode dummy(0); dummy.next = p;
ListNode *sp = &dummy;
ListNode *fp = &dummy;

bool bOdd = false;
ListNode *toCut = NULL;
while(fp)
{
toCut = sp;
sp = sp->next;
fp = fp->next;
if(fp)    fp = fp->next;
else    bOdd = true;
}
if(bOdd)
{
toCut->next = NULL;
return sp;
}
else
{
ListNode *tmp = sp->next;
sp->next = NULL;
return tmp;
}
}
ListNode * interleave(ListNode *p0, ListNode *p1)
{
ListNode *pa = p0;
ListNode *pb = pa->next;
ListNode *pc = p1;
ListNode *pd = pc->next;
while(pa && pc)
{
pa->next = pc; pc->next = pb;

pa = pb;
if(pb) pb = pb->next;
pc = pd;
if(pd) pd = pd->next;
}
return p0;
}
ListNode *reverseList(ListNode *p)
{
if(!p->next) return p;

ListNode *p0 = NULL;
ListNode *p1 = p;
ListNode *p2 = p->next;

//    Reverse
while(p1)
{
p1->next = p0;
p0 = p1;
p1 = p2;
if(p2) p2 = p2->next;
}

return p0;
}
void reorderList(ListNode *head) {
if(!head || !head->next) return;

ListNode *p1 = findHalf(head);
p1 = reverseList(p1);
interleave(head, p1);
}
};


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