LeetCode—Reorder List

来源:互联网 发布:python 计算macd 编辑:程序博客网 时间:2024/06/07 20:49

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}.

想法比较简单

利用快慢两个指针将链表一分为二,针对第二个子链表求倒序,最后将两个子链表合并。
一分为二的方法参考了前面链表排序中用到的归并排序用到的算法
这里代码写得比较长,但是好像在网上也没有找到更好的更简洁的,如果有更好的方法欢迎交流
/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:void reorderList(ListNode *head) {if(!head || !head->next){return ;}ListNode * midL = head;ListNode * midR = head;ListNode * midPre = NULL;while(midR && midR->next)  //<find the middle point{midR = midR->next->next;midL= midL->next;}ListNode *pre  = midL->next;midL->next = NULL;ListNode *pCur = NULL;if (pre)   //<reverse the second part of the link{pCur = pre;if(pre->next){pCur = pre->next;pre->next = NULL;  //<the last point in the reverse list should point to nullwhile(pCur){ListNode *pNext = pCur->next;if(pNext){pCur->next = pre;pre = pCur;pCur = pNext;}else{pCur->next = pre;break;}}}}ListNode * q = head;           //merge the two partwhile(q && pCur){ListNode *tempL = q->next;ListNode *tempR = pCur->next;q->next = pCur;pCur->next = tempL;pCur = tempR;q = tempL;}//return head;}};




0 0
原创粉丝点击