美文网首页
链表类算法题汇总

链表类算法题汇总

作者: DejavuMoments | 来源:发表于2019-05-27 23:51 被阅读0次

算法题目中常考察的链表操作无非以下几种:

  • 链表反转
  • 链表合并
  • 寻找链表中点
  • 寻找链表倒数第 K 个节点
  • 删除链表节点
  • 判断链表是否有环
  • 两个链表的第一个公共节点
  • 复杂链表的复制

143. Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…

You may not modify the values in the list's nodes, only nodes itself may be changed.

Example 1:

Given 1->2->3->4, reorder it to 1->4->2->3.

Example 2:

Given 1->2->3->4->5, reorder it to 1->5->2->4->3.

Hint: 链表中点 链表反转 链表合并

解题思路:
1.利用快慢指针找到链表中点
2.从中点处断开链表,分成 A、B 两段
3.反转中点之后的B段链表节点(注意细节,四步反转)
4.循环A、B 两段链表,并将第二段链表节点间隔插入第一段链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void reorderList(ListNode* head) {
        
        // 
        if(head == nullptr || head->next == nullptr || head->next->next == nullptr) return;
        
        ListNode* slow = head;
        ListNode* fast = head;
        
        while(fast->next && fast->next->next){
            slow = slow->next;
            fast = fast->next->next;
        }
        
        // 获得中点
        ListNode* mid = slow->next;
        // 从中点位置断开
        slow->next = nullptr;
        
        // 反转第二部分链表
        ListNode* last = mid;
        ListNode* prev = nullptr;
        while(last){
            ListNode* next = last->next;
            last->next = prev;
            prev = last;
            last = next;
        }
        
        // 间隔插入第一个链表中
        while(head && prev){
            ListNode* next = head->next;
            head->next = prev;
            prev = prev->next;
            head->next->next = next;
            head = next;
        }
    }
};

相关文章

  • 链表类算法题汇总

    算法题目中常考察的链表操作无非以下几种: 链表反转 链表合并 寻找链表中点 寻找链表倒数第 K 个节点 删除链表节...

  • 链表

    链表是一类大的算法题。 一般分为一下几部分: 链表反转 链表合并 我们分别进行下讨论。 1. 链表反转比较典型的例...

  • 单链表的冒泡,快排,选择,插入,归并等多图详解

    上节介绍了链表的基本操作史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)这节介绍链表的5种排序算法...

  • Tourist with Data Structure Seco

    链表 读题要仔细,只看题干,容易死的很惨。 设计链表 环形链表 一般环形链表使用快慢指针方式去做,快慢指针算法。参...

  • 数据结构与算法-链表相关题

    数据结构预算法题 正确的解算法题,前提是要正确审题,找出关键词! 题⽬1 : 将2个递增的有序链表合并为⼀个链表的...

  • ARTS 20201208-1215

    Algorithm: 每周至少做一个 LeetCode 的算法题算法题:1 剑指 offer 24: 翻转链表递归...

  • python链表及算法

    实现了python单向链表及一些算法题

  • 814. Binary Tree Pruning, 二叉树剪枝

    非典型链表题 把这一题放链表类,是因为能得到联系和启发;

  • 希望变得熟练,然后游刃有余

    链表的算法题还是不是很熟啊,虽然今天的反转链表的题已经写的相对熟练了,可是还是不够理解,晚上接雨水这道题倒...

  • leetcode链表之反转链表

    本文主要有三道题,都是关于反转链表的算法题,由浅入深。文章出现的代码都是python3 206、反转链表[http...

网友评论

      本文标题:链表类算法题汇总

      本文链接:https://www.haomeiwen.com/subject/yksltctx.html