【LeetCode】剑指 Offer II 026. 重排链表
class Solution {
public:
void reorderList(ListNode* head) {
if(head==nullptr){
return;
}
ListNode* mid = findMiddle(head);
ListNode* l1=head;
ListNode* l2=mid->next;
mid->next = nullptr;
l2 = reverseList(l2);
mergeList(l1,l2);
}
ListNode * findMiddle(ListNode* head){
ListNode* fast = head;
ListNode* slow = head;
while(fast->next!=NULL&&fast->next->next!=NULL){
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
ListNode * reverseList(ListNode* head){
ListNode* pre = NULL;
ListNode* cur = head;
while(cur){
ListNode* nextTemp=cur->next;
cur->next=pre;
pre=cur;
cur=nextTemp;
}
return pre;
}
void mergeList(ListNode * l1,ListNode * l2)
{
ListNode* l1_tmp;
ListNode* l2_tmp;
while(l1!=nullptr && l2!= nullptr){
l1_tmp=l1->next;
l2_tmp=l2->next;
l1->next = l2;
l1=l1_tmp;
l2->next=l1;
l2 = l2_tmp;
}
}
};
思路:这道题可以转化为把一个链表分为前后两部分,首先找到中点,再把第二个部分原地翻转,最后组合前后两个部分,这样就可以实现链表的翻转

浙公网安备 33010602011771号