/**算法思想是:先將鏈表拆成兩部分,然後逆轉後面的一部分,最後合併兩個部分得到最終的結果鏈表
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reverseList(ListNode *&head)//鏈表的逆轉
{
if (head == NULL)
return ;
ListNode*p = NULL,*s=NULL;
while (head ->next!= NULL)
{
s = head->next;
head->next = p;
p = head;
head = s;
}
head->next = p;
}
void reorderList(ListNode* head)
{
if (head == NULL || head->next == NULL || head->next->next == NULL)
return;
ListNode *p = head, *q = head;
//拆鏈表
while (p && q && q->next && q->next->next)
{
p = p->next;
q = q->next->next;
}
ListNode*s = p->next,*m=NULL;//第二部分的首結點;
p->next = NULL;//截斷第一部分;
reverseList(s);//鏈表逆轉
//合併鏈表
p = head;
while (p != NULL&&s != NULL)
{
m = p->next;
q = s->next;
p->next = s;
s->next = m;
p = m;
s = q;
}
}
};
143. Reorder List
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.