143. 重排链表

tech2026-08-25  2

题目: 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

方法:双指针+快慢指针+翻转链表 1.快慢指针找到切分链表 2.翻转右半部分链表 3左右合并拼接,依次合并

函数代码:

class Solution { public: void reorderList(ListNode* head) { if(!head||!head->next) { return; } ListNode *fast=head; ListNode *slow=head; while(fast->next&&fast->next->next) { fast=fast->next->next; slow=slow->next; } fast=slow->next; slow->next=NULL; ListNode *dummy=new ListNode(0); while(fast) { ListNode *n=dummy->next; dummy->next=fast; ListNode *nn=fast->next; fast->next=n; fast=nn; } slow=head; fast=dummy->next; while(slow) { if(fast) { ListNode *n=slow->next; slow->next=fast; ListNode *nn=fast->next; fast->next=n; slow=n; fast=nn; } else { break; } } } };
最新回复(0)