LeetCode-143. 重排链表【栈 递归 链表 双指针】

发布于:2024-04-14 ⋅ 阅读:(122) ⋅ 点赞:(0)

题目描述:

给定一个单链表 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

解题思路一:找到中点,翻转后半段链表。然后依次改变指针顺序即可。

问:循环条件 while head2.next 为什么不能写成 while head2?

答:如果链表长度为偶数,例如链表由 [1,2,3,4]四个节点组成,那么找中间节点并反转后,我们得到的两个链表分别为 head=[1,2,3] 和 head2=[4,3]。注意它俩都包含节点 3。如果写成 while head2,会导致最后一轮循环中 3 指向它自己。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def middleNode(self, head: Optional[ListNode]) -> None:
        slow, fast = head, head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        return slow
    
    def reverseList(self, head: Optional[ListNode]) -> None:
        pre, cur = None, head
        while cur:
            tmp = cur.next
            cur.next = pre
            pre = cur
            cur = tmp
        return pre
        
    def reorderList(self, head: Optional[ListNode]) -> None:
        mid = self.middleNode(head)
        head2 = self.reverseList(mid)
        # copy_head = head
        while head2.next:
            tmp1 = head.next
            tmp2 = head2.next
            head.next = head2
            head2.next = tmp1
            head = tmp1
            head2 = tmp2
        # print(copy_head) 最终只需地址对应即可

时间复杂度:O(n)
空间复杂度:O(1)

解题思路二:0


时间复杂度:O(n)
空间复杂度:O(n)

解题思路三:0


时间复杂度:O(n)
空间复杂度:O(n)


网站公告

今日签到

点亮在社区的每一天
去签到