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 }

 

posted @ 2021-07-28 21:07  瑜琦  阅读(118)  评论(0)    收藏  举报