143. 重排链表-链表拆分+反转+合并-字节跳动高频题

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了143. 重排链表-链表拆分+反转+合并-字节跳动高频题相关的知识,希望对你有一定的参考价值。

一、题目描述

示例 1:
输入:head = [1,2,3,4]
输出:[1,4,2,3]
示例 2:

输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]

二、解题

链表拆分+反转+合并

这题牵扯到三个问题,先将链表拆分为前后两部分链表,先使用快慢指针找到中间节点,然后将中间节点断开,然后在将后部分的链表翻转,然后在将前后两部分合并,这里的合并是直接合并,如果是返回合并后的头结点,就可以使用哑结点来去除边界条件判断。

/**
 * Definition for singly-linked list.
 * public class ListNode 
 *     int val;
 *     ListNode next;
 *     ListNode() 
 *     ListNode(int val)  this.val = val; 
 *     ListNode(int val, ListNode next)  this.val = val; this.next = next; 
 * 
 */
class Solution 
    public void reorderList(ListNode head) 
        //这题是将前半部分和后半部分拆分,将后半部分翻转,然后在合并
        //前半部分和后半部分拆分,可以使用快慢指针实现,然后在将后半部分翻转,保存中间节点的下一个值,然后翻转,最后返回翻转后的后半部分的头结点,然后在合并前后两部分的链表
        if(head == null)
            return ;
        
        ListNode slow = head,fast = head;
        while(fast.next != null && fast.next.next != null)
            slow = slow.next;
            fast = fast.next.next;
        
        //找到后半部分的链表
        ListNode mid = slow.next;
        //然后翻转后半部分链表
        ListNode right = reverseList(mid);
        //取前部分链表
        slow.next = null;
        ListNode left = head;
        //然后合并两个链表
        merge(left,right);
        
    
    //反转链表,迭代或者递归两种都可以
    //递归
    public ListNode reverseList(ListNode head)
        if(head == null || head.next == null)
            return head;
        
        //找到最后一个节点
        ListNode cur = reverseList(head.next);
        //4->5然后翻转为5->4 head为4,head.next为5
        head.next.next = head;
        head.next = null;
        return cur;
    
    //合并两个链表,每次合并两个
    public void merge(ListNode l1,ListNode l2)
        ListNode a,b;
        while(l1!=null && l2!=null)
            a = l1.next;
            b = l2.next;

            l1.next = l2;
            l1 = a;

            l2.next = l1;
            l2 = b;
        
    

链表合并

 public void merge(ListNode l1,ListNode l2)
        ListNode a,b;
        while(l1!=null && l2!=null)
            a = l1.next;
            b = l2.next;

            l1.next = l2;
            l1 = a;

            l2.next = l1;
            l2 = b;
        
    

以上是关于143. 重排链表-链表拆分+反转+合并-字节跳动高频题的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode - 143 - 重排链表 - Java - 两种解法 - 细致

leetcode143重排链表

[LeetCode] 143. 重排链表

链表题型归纳

字节跳动高频算法题TOP100

字节跳动高频算法题TOP100