C++相交链表和反转链表详解

C++相交链表和反转链表详解

相交链表

相交链表即链表两个节点开始重合,即它们的next指针指向同一个节点。我们可以通过以下两种方法实现相交链表的查找:

1.暴力法

这是一种比较直接的方法,即双层for循环,分别遍历两个链表,找到首个指针相同的节点即为相交节点。时间复杂度为O(mn)。

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    while (headA) {
        ListNode *p = headB;
        while (p) {
            if (headA == p) return headA;
            p = p->next;
        }
        headA = headA->next;
    }
    return nullptr;
}

2.双指针法

在双指针法中,我们分别遍历两个链表并计算它们的长度,然后对长链表的指针进行偏移,使两个链表的连结点到达同一位置之后进行遍历,查找到首个指针相同的节点即为相交节点。时间复杂度为O(m+n)。

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    int lenA = calLength(headA), lenB = calLength(headB);
    int k = abs(lenA - lenB);
    if (lenA > lenB) while (k--) headA = headA->next;
    else if (lenB > lenA) while (k--) headB = headB->next;
    while (headA && headB) {
        if (headA == headB) return headA;
        headA = headA->next;
        headB = headB->next;
    }
    return nullptr;
}

int calLength(ListNode *head) {
    int cnt = 0;
    while (head) {
        cnt++;
        head = head->next;
    }
    return cnt;
}

反转链表

反转链表是指将链表中的指针方向从原来的单向改为反向,即一个节点的指针指向它前面的节点。以下是一种常用的递归方法:

ListNode* reverseList(ListNode* head) {
    if (!head || !head->next) return head;
    ListNode* newHead = reverseList(head->next);
    head->next->next = head;
    head->next = nullptr;
    return newHead;
}

以下是一种迭代方法:

ListNode* reverseList(ListNode* head) {
    ListNode *prev = nullptr;
    while (head) {
        ListNode *temp = head->next;
        head->next = prev;
        prev = head;
        head = temp;
    }
    return prev;
}

示例说明

相交链表

假设现在有两个链表,分别为:

链表1: 1 -> 2 -> 3 -> 4 -> 5 -> 6,并且其尾部指向节点3;

链表2: 7 -> 8 -> 3 -> 4 -> 5 -> 6。

这两个链表相交于节点3,我们想要编写一个程序,通过代码得到它们的交点。

使用暴力法,代码如下:

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    while (headA) {
        ListNode *p = headB;
        while (p) {
            if (headA == p) return headA;
            p = p->next;
        }
        headA = headA->next;
    }
    return nullptr;
}

使用双指针法,代码如下:

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    int lenA = calLength(headA), lenB = calLength(headB);
    int k = abs(lenA - lenB);
    if (lenA > lenB) while (k--) headA = headA->next;
    else if (lenB > lenA) while (k--) headB = headB->next;
    while (headA && headB) {
        if (headA == headB) return headA;
        headA = headA->next;
        headB = headB->next;
    }
    return nullptr;
}

int calLength(ListNode *head) {
    int cnt = 0;
    while (head) {
        cnt++;
        head = head->next;
    }
    return cnt;
}

反转链表

链表:1 -> 2 -> 3 -> 4 -> 5,我们想要将这个链表反转。使用迭代法,代码如下:

ListNode* reverseList(ListNode* head) {
    ListNode *prev = nullptr;
    while (head) {
        ListNode *temp = head->next;
        head->next = prev;
        prev = head;
        head = temp;
    }
    return prev;
}

使用递归法,代码如下:

ListNode* reverseList(ListNode* head) {
    if (!head || !head->next) return head;
    ListNode* newHead = reverseList(head->next);
    head->next->next = head;
    head->next = nullptr;
    return newHead;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++相交链表和反转链表详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • iOS12 beta2怎么升级 苹果ios12开发者预览版beta2更新升级图文教程

    iOS12 beta2怎么升级 苹果ios12开发者预览版beta2更新升级图文教程 前言 苹果在 WWDC 2018 上发布了最新的 iOS 12 系统,并随之推出了开发者预览版 beta1。现在,苹果已经正式发布了开发者预览版 beta2,并且相信很多开发者和比较关注苹果系统的用户都非常想要体验新版系统所带来的新功能和优化。那么,本篇文章将为大家详细讲解…

    other 2023年6月26日
    00
  • python去除字符串中的换行符

    在Python中,可以使用多种方法去除字符串中的换行符。下面是一些常用的方法: 方法一:使用replace()函数 可以使用Python内置的replace()函数来换字符串中的换行符。示例代码如下: str_with_newline = "Hello,\nWorld!" str_without_newline = str_with_ne…

    other 2023年5月8日
    00
  • mybatis实体类字段大小写及字段获取不到值问题

    当然!下面是关于\”mybatis实体类字段大小写及字段获取不到值问题\”的完整攻略: mybatis实体类字段大小写及字段获取不到值问题 在使用 MyBatis 进行数据库操作时,可能会遇到实体类字段大小写不一致或字段获取不到值的问题。以下是两个示例: 示例1:实体类字段大小写不一致问题 在数据库表和实体类字段命名不一致的情况下,可以通过在 SQL 映射文…

    other 2023年8月19日
    00
  • SpringBoot整合PageHelper实现分页查询功能详解

    SpringBoot整合PageHelper实现分页查询功能详解 SpringBoot是一个快速开发Java应用程序的框架,而PageHelper是一个用于分页查询的插件。本攻略将详细讲解如何在SpringBoot项目中整合PageHelper,实现分页查询功能。 1. 添加依赖 首先,在项目的构建文件中添加PageHelper的依赖。对于Maven项目,可…

    other 2023年10月17日
    00
  • mybatisplus where QueryWrapper加括号嵌套查询方式

    MyBatis Plus Where QueryWrapper加括号嵌套查询方式攻略 MyBatis Plus是一个优秀的持久层框架,提供了丰富的查询功能。其中,QueryWrapper是一个用于构建查询条件的类,可以通过加括号嵌套查询方式实现更复杂的查询条件。下面是详细的攻略。 1. 基本概念 在使用QueryWrapper进行查询时,可以通过加括号的方式…

    other 2023年7月28日
    00
  • Qt实现网络聊天室的示例代码

    下面是使用Qt实现网络聊天室的完整攻略。 简介 Qt是一款跨平台的C++开发框架,它提供了丰富的GUI界面开发组件和网络编程组件,可以轻松开发跨平台的图形化应用程序和网络应用程序。 网络编程是Qt框架的一个重要组成部分,Qt提供了QTcpServer、QTcpSocket、QUdpSocket等网络编程组件,这些组件可以方便地实现基于TCP协议和UDP协议的…

    other 2023年6月27日
    00
  • ubuntu中的wordpress安装教程

    以下是关于“Ubuntu中的WordPress安装教程”的完整攻略,包含两个示例。 Ubuntu中的WordPress安装教程 WordPress是一个流行的开源内容管理系统,用于创建和管理网站。在Ubuntu中,我们可以使用LAMP(Linux、Apache、MySQL、PHP)堆栈安装WordPress。以下是关于如何在Ubuntu中安装WordPres…

    other 2023年5月9日
    00
  • .NET中的HashSet及原理解析

    .NET中的HashSet及原理解析 在 .NET 中,HashSet 是一个高效的集合类,用来存储一组唯一的元素。本文将对 HashSet 进行详细的讲解和原理解析。 HashSet 的使用 HashSet 是一个泛型集合类型,可以用于存储任何类型的对象。我们可以使用以下代码创建一个 HashSet: HashSet<string> set =…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部