您的位置:首页 > 编程语言 > Java开发

143. Reorder List | Java最短代码实现

2016-03-19 21:30 417 查看
原题链接:143. Reorder List
反转链表:206. Reverse Linked List | Java最短代码实现
【思路】

本题考查链表的归并、反转、查找中间结点等知识点。由于过程比较复杂,我的代码尽量写的逻辑清晰,以 [1, 2, 3, 4, 5, 6] 为例对代码进行剖析:

1.找到中间节点3,将链表划分为两部分:以head为头节点的 [1,2,3]、以head2为头节点的[4,5,6]

2.将head2指向的链表反转,得到[6,5,4]

3.归并两链表,得到 [1,6,2,5,3,4]:

public class Solution {
public void reorderList(ListNode head) {
if (head == null) return;
ListNode mid = getMidList(head);
ListNode head2 = mid.next;
mid.next = null;
head2 = reverse(head2);
mergeList(head, head2);
}
public ListNode mergeList(ListNode head1, ListNode head2) {
ListNode head = head1;
while (head2 != null) {
ListNode head2Next = head2.next;
head2.next = head1.next;
head1.next = head2;
head1 = head2.next;
head2 = head2Next;
if (head2Next != null)
head2Next = head2Next.next;
}
return head;
}
public ListNode getMidList(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
public ListNode reverse(ListNode head) {
if (head == null) return head;
ListNode slow = head;
ListNode fast = head.next;
head.next = null;
while (fast != null) {
slow = fast;
fast = fast.next;
slow.next = head;
head = slow;
}
return slow;
}
13 / 13 test
cases passed. Runtime: 3
ms Your runtime beats 26.98% of javasubmissions.

欢迎优化!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: