408算法练习——重排链表
重排链表
题目链接:https://leetcode-cn.com/problems/reorder-list/
一、问题描述
给定一个单链表 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
二、问题分析
由题干描述信息,不难发现,就是要将链表的后一半结点反转,然后交错的插入前一半链表。使用快慢指针找到中间元素,然后断开后一半元素,反转后交错差入前一半元素
三、代码
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode() {} 7 * ListNode(int val) { this.val = val; } 8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; } 9 * } 10 */ 11 class Solution { 12 public void reorderList(ListNode head) { 13 ListNode mid = middleNode(head); 14 ListNode L2 = mid.next; 15 mid.next = null; 16 L2 = reverseList(L2); 17 unlitList(head,L2); 18 } 19 public ListNode middleNode(ListNode head) {//寻找中间结点 20 ListNode slow = head; 21 ListNode fast = head; 22 while (fast.next != null && fast.next.next != null) { 23 slow = slow.next; 24 fast = fast.next.next; 25 } 26 return slow; 27 } 28 29 public ListNode reverseList(ListNode head) {//反转链表 30 ListNode prev = null; 31 ListNode curr = head; 32 while (curr != null) { 33 ListNode nextTemp = curr.next; 34 curr.next = prev; 35 prev = curr; 36 curr = nextTemp; 37 } 38 return prev; 39 } 40 41 public void unlitList(ListNode l1,ListNode l2){//合并两个链表 42 ListNode i; 43 ListNode j; 44 while (l1 != null && l2 != null) { 45 i = l1.next; 46 j = l2.next; 47 48 l1.next = l2; 49 l1 = i; 50 51 l2.next = l1; 52 l2 = j; 53 } 54 } 55 }

浙公网安备 33010602011771号