重排链表
题目描述
- 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
题解(java)
class Solution {
public void reorderList(ListNode head) {
if (head == null) {
return;
}
// mid为返回中间节点链表的头结点
ListNode mid = middleNode(head);
ListNode l1 = head;
ListNode l2 = mid.next;
mid.next = null;
l2 = reverseList(l2);
mergeList(l1, l2);
}
public ListNode middleNode(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
public void mergeList(ListNode l1, ListNode l2) {
ListNode l1_tmp;
ListNode l2_tmp;
while (l1 != null && l2 != null) {
l1_tmp = l1.next;
l2_tmp = l2.next;
l1.next = l2;
l1 = l1_tmp;
l2.next = l1;
l2 = l2_tmp;
}
}
}
图示
详解
- 简单来说该题解法分为三步【1.得到链表的中间节点2.反转后半部分链表3.重排链表】
- 我们首先的到前半部分链表为 链表1,只需设中间节点的下一节点为nul
- 然后得到后半部分链表 链表2,返回中间节点的下一节点即可
- 然后调用重排链表的函数将两个链表重新排列,返回新的链表即可
Tips
- 注意,当我们遇到两个中间节点时,返回前一个节点
难点
- 重排链表这道题情况比较复杂,需要用到【找到链表的中间节点,反转链表,将链表重新排序】
- 掌握多个算法的合并运用
声明
- 原作者:E.L.E
- <本文章著作权归原作者所有,商业转载请获得作者授权,非商业转载请注明来处,欢迎大家评论>