LeetCode刷题——重排链表#143#Medium

重排链表的思路探讨与源码
    重排链表的题目如下图,该题属于递归和链表类型的题目,主要考察对于递归方法的使用和链表结构的理解。本文的题目作者想到2种方法,分别是递归方法和双指针方法,其中递归方法使用Java进行编写,而双指针方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
LeetCode刷题——重排链表#143#Medium_第1张图片
    本人认为该题目可以使用递归算法进行解决,首先设计一个递归函数并传入当前的未重新排序的链表。然后是在链表内部,先判断尾端是否为空,如果是空就直接头部;然后递归调用当前函数,判断递归结果是否为空,如果是空就直接返回空。判断节点是否是尾部节点或者节点的下一个元素是否为尾部节点,如果是就将尾部元素的下一个节点设置为空并返回。如果不符合上述的判断条件就将尾部节点的下一个节点设置为递归搜索的节点的下一个节点,再把递归搜索节点指到尾部节点,最终返回递归搜索结果,直到最终跳出递归搜索得到的结果就是重新排序的链表结果。那么按照这个思路我们的Java代码如下:

#喷火龙与水箭龟
class Solution {
    public void reorderList(ListNode head) {
    searchRecr(head, head);
}

public ListNode searchRecr(ListNode head, ListNode tail) {
    if(tail == null){
        return head;
    }
    ListNode listGood = searchRecr(head,tail.next);
    if(listGood == null) {
        return null;
    }
    if(listGood == tail || listGood.next == tail) {
        tail.next = null;
        return null;
    }
    tail.next = listGood.next;
    listGood.next = tail;
    return tail.next;
}
}

LeetCode刷题——重排链表#143#Medium_第2张图片
    显然,我们看到递归算法的效果还行,同时还可以使用双指针的方法解决。首先是判断链表是否为空或者是否只有一个元素,如果是就直接返回,因为无需重新排序。然后初始化一个列表,再把链表赋值给新的变量,开始搜索这个新的变量,把链表的节点都插入到这个列表里面去,同时找到链表的尾部节点,并且计算列表的长度。初始化双指针,头部指针在第一个元素的位置,尾部指针在最后一个元素的位置。然后开始遍历搜索列表,当头部指针小于尾部指针的时候,说明还需要继续搜索,在搜索结构内部是将尾部指针所在的节点的下一个元素指向头部指针所在的节点的下一个元素,再将头部指针的所在节点的下一个元素指向为尾部指针所在节点,并且将头部指针右移一位,将尾部指针左移一位,遍历结束后将头部节点的下一个元素设置为空,得到的结果就是重新排序的结果链表。所以按照这个思路就可以解决,下面是Python代码:

#喷火龙与水箭龟
class Solution:
    def reorderList(self, head: ListNode) -> None:
        if(head == None or head.next == None):
            return 
        listGoodOrder = []
        ind = head
        while ind:
            listGoodOrder.append(ind)
            ind = ind.next
        orderLen = len(listGoodOrder)
        a = 0
        b = orderLen-1
        while a < b:
            listGoodOrder[b].next = listGoodOrder[a].next
            listGoodOrder[a].next = listGoodOrder[b]
            a = a + 1
            b = b - 1
        listGoodOrder[a].next = None

LeetCode刷题——重排链表#143#Medium_第3张图片
    从结果来说Java版本的递归方法的效率还不错,而Python版本的双指针方法的速度也还可以,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

你可能感兴趣的:(LeetCode刷题,链表,leetcode,数据结构,python,算法)