[LeetCode]143. 重排链表(java实现)链表综合
1. 题目
2. 读题(需要重点注意的东西)
思路(链表综合):
-
找到链表中间的点;(快慢指针找中间节点)
快慢指针找中间节点:
快指针每次走两步,慢指针每次走一步,当快指针走到终点的时候,慢指针指向的节点就是中间节点 -
让右半部分翻转(反转链表)
-
然后将左半部分和右半部分从头结点开始交错遍历即可(合并两个链表)
3. 解法
---------------------------------------------------解法---------------------------------------------------:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
if(head == null || head.next == null) return;
// 1. 快慢指针找中间节点
ListNode slow = head;
ListNode fast = head;
while(fast.next != null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
}
// 此时中间节点是slow
// 2. 将前后链表断开,中间节点slow分给前半段,再将后半部分翻转
// 此时链表分为两部分: [head,slow],[slow.next,end]
ListNode tail = slow.next;
slow.next = null;
// 将后半部分翻转
ListNode pre = null;
while(tail != null){
ListNode temp = tail.next;
tail.next = pre;
pre = tail;
tail = temp;
}
// 此时后半部分的起始节点是pre
// 3. 交错构建链表
ListNode cur = head;
while (cur != null && pre != null) {
ListNode cur_next = cur.next, pre_next = pre.next;
cur.next = pre;
pre.next = cur_next;
cur = cur_next;
pre = pre_next;
}
}
}
可能存在的问题:
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 链表
6. 总结
- 快慢指针找中间节点的方法
- 合并链表的方法
- 反转链表的方法