力扣题目
解题思路
java代码
力扣题目:
给定一个单链表 L
的头节点 head
,单链表 L
表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4] 输出:[1,4,2,3]
示例 2:
输入:head = [1,2,3,4,5] 输出:[1,5,2,4,3]
提示:
- 链表的长度范围为
[1, 5 * 104]
1 <= node.val <= 1000
解题思路:
-
reorderList
方法:- 首先检查链表是否为空。
- 找到链表的中点。
- 将链表从中点分成两个子链表。
- 反转第二个子链表。
- 合并两个子链表。
-
middleNode
方法:- 使用快慢指针技巧找到链表的中点。快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针会位于链表的中点。
-
reverseList
方法:- 反转链表。通过迭代方式,将每个节点的
next
指针指向前一个节点。
- 反转链表。通过迭代方式,将每个节点的
-
mergeList
方法:- 合并两个链表。交替从两个链表中取节点,将它们连接起来。
java代码:
package org.example.mouth7.today712;
public class Leetcode143 {
public static void main(String[] args) {
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);
reorderList(head);
while (head != null) {
System.out.println(head.val);
head = head.next;
}
}
public static void reorderList(ListNode head) {
if (head == null) {
return;
}
ListNode mid = middleNode(head);
ListNode l1 = head;
ListNode l2 = mid.next;
mid.next = null;
l2 = reverseList(l2);
mergeList(l1, l2);
}
public static 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 static 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 static 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;
}
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项