【LeetCode-143】重排链表
问题
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例
给定链表 1->2->3->4, 重新排列为 1->4->2->3。
解答
class Solution {
public:
void reorderList(ListNode* head) {
ListNode* mid = findMid(head);
ListNode* nxt_head = mid->next;
mid->next = nullptr;
ListNode* l1 = head;
ListNode* l2 = reverseList(nxt_head);
while (l2) {
ListNode* tmp = l2->next;
l2->next = l1->next;
l1->next = l2;
l1 = l2->next;
l2 = tmp;
}
}
ListNode* findMid(ListNode* head) {
ListNode *slow = head, *fast = head;
while (fast && fast->next && fast->next->next) {
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) return head;
ListNode* res = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return res;
}
};
重点思路
- 寻找链表中点,断链;
- 反转后面部分链表;
- 合并两个链表。