🟡 剑指 Offer II 026. 重排链表
LeetCode 提示
题目难度 中等
原题链接 🔗 leetcode
#
题解1用两步法找到链表中点,把后半段反转,然后逐个插入到前半段即可。
注意边界情况。(这次竟然能一次写对也是很离谱)
/** * 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; }
ListNode p = head, q = head; while (q != null) { q = q.next; if (q != null) { q = q.next; p = p.next; } } // 从p开始反转
ListNode mid = p.next, nxt; q = null; p.next = null; p = mid;
while (p != null) { nxt = p.next; p.next = q; q = p; p = nxt; }
// q 是后半段头 p = head; while (q != null) { nxt = p.next; p.next = q; q = q.next; p.next.next = nxt; p = nxt; } }}