链表算法-回文结构、两个链表公共节点

news/2025/2/14 1:43:28/

最近一直在刷算法,以前没有重视这块,偶然巧合下,想到了某几次的面试,虽然没有以这个为主,但是也都有问过算法的题,因为没有这方面的积累,所以心底里一直抗拒,最近也有时间,觉得还是要花时间学习研究算法的东西,锻炼锻炼逻辑思路和解决思路。

学习路程肯定是要把基础掌握好的,你得知道各个名词的含义,如链表是什么,单链表怎么实现,双链表怎么实现,你才能处理把握链表出的方向的算法题,如树,什么是二叉树,二叉搜索树,二三树,红黑树,你知道每个结构的定义以及特性,才能掌握和思考怎么处理,这一定是必然的。

今天弄几个链表算法

1.判断链表回文结构

1.对单链表逆顺序是否与原链表顺序相同,也就是回文链表,如1->2 ->1,那么1->2->1这个就是true,如1->2,那么逆序就是2->1那么就是false;

因为链表有个特点不知道长度,不能随机用下标访问数据,所以需要遍历到最后才能全部知道数据,这道题可以采用先遍历将链表数据存储到数组中,然后采用二分法进行前后对比数据,直到遇到不相等则直接退出循环,返回false,一直相等则就是链表的回文数据,

public boolean isPail (ListNode head) {List<Integer> list = new ArrayList();ListNode w = head;// 将链表数据存储到数组中while (w != null) {list.add(w.val);w = w.next;}int size = list.size();boolean result = true;// 将数组长度/2 得到回文顺序交界点for (int i = 0; i < size / 2; i++) {// 从前往后对比直到交界点,全部都比对完毕if (list.get(i).equals(list.get(size - i - 1))) {} else {result = false;break;}}return result;
}// 节点,是个内部类
public static class ListNode {int val;ListNode next = null;
}

测试示例

 ListNode ListNode = new ListNode();ListNode.val = 1;ListNode.next = null;ListNode ListNodeNext = new ListNode();ListNodeNext.val = 2;ListNodeNext.next = null;ListNode.next = ListNodeNext;ListNode ListNodeNextn = new ListNode();ListNodeNextn.val = 3;ListNodeNextn.next = null;ListNodeNext.next = ListNodeNextn;ListNode ListNodeNextns = new ListNode();ListNodeNextns.val = 3;ListNodeNextns.next = null;ListNodeNextn.next = ListNodeNextns;ListNode ListNodeNextnn = new ListNode();ListNodeNextnn.val = 2;ListNodeNextnn.next = null;ListNodeNextns.next = ListNodeNextnn;ListNode ListNodeNextnns = new ListNode();ListNodeNextnns.val = 1;ListNodeNextnns.next = null;ListNodeNextnn.next = ListNodeNextnns;System.out.println(AboutLinked.isPail2(ListNode));

输入:1->2->3->3-2>1返回结果 true

自己写的一个版本,当时主要考虑不想遍历放入数组中,再次进行遍历,所以用了String的字符串拼接方式。

public boolean isPail (ListNode head) {String s="";String ss ="";ListNode w = head;while (w != null) {s+=w.val+"";ss=w.val+ss;;w = w.next;}return s.equals(ss);}

这种方式答案是对的,但是性能太差,输入量特多的情况下,会超时反馈不出结果,我想主要原因还是出在了字符串拼接导致的问题,我本想减少代码,减少一些遍历,但是却出现了其他的性能问题,不用StringBuffer的原因是想要倒着拼接,如果使用reverse则负数又会出现问题,

String采用连接运算符(+)效率低下,都是上述循环、大批量数据情况造成的,每做一次"+"就产生个StringBuilder对象,然后append后就扔掉。下次循环再到达时重新产生个StringBuilder对象,然后append字符串,如此循环直至结束。如果我们直接采用StringBuilder对象进行append的话,我们可以节省创建和销毁对象的时间。

2. NC66两个链表的第一个公共节点

输入两个非公共的链表{1,2,3}以及{4,5}和一个公共链表{6,7},塞入到两个公共链表里头,变为{1,2,3,6,7}以及{4,5,6,7},请输出他们的第一个公共节点,那么得到的就是{6,7}

我们需要两个链表一一比对,直到某个链表为空,另一个链表还有值时进行两个链表替换,然后继续对比,本示例当对比空以后将temp赋值为temp2{1,2,3,6,7},temp2赋值为temp则{4,5,6,7},当temp链表走到空时,temp2链表已经赋值为1,那么当temp为空时,就赋值temp2为4,此时temp就为2,就变成了2:4,3:5,6:6 相同直接结束循环,是不是清楚很多,那么代码如下

public class Solution {public static class ListNode {int val;ListNode next = null;}
// pHead1={1,2,3,6,7}  pHead2={4,5,6,7}public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {ListNode temp = pHead1;ListNode temp1 = pHead2;while (temp != temp1) {// 如果为空互相替换来找出公共节点temp = temp!=null?temp.next:pHead2;temp1 = temp1!=null?temp1.next:pHead1;}return temp;}}

咱们就不演示测试了否择还得遍历打印链表,本次案例结果返回6->7


http://www.ppmy.cn/news/10667.html

相关文章

Make RepVGG Greater Again | 中文翻译

性能和推理速度之间的权衡对于实际应用至关重要。而重参化可以让模型获得了更好的性能平衡&#xff0c;这也促使它正在成为现代卷积神经网络中越来越流行的架构。尽管如此&#xff0c;当需要INT8推断时&#xff0c;其量化性能通常太差&#xff0c;无法部署&#xff08;例如Imag…

数字IC设计学习比较实用的资料推荐

!!!!!!!!!!!!!!!!!!!!!! 审核麻烦看一下,无下载,只是推荐书单。谢谢 !!!!!!!!!!!!!!!!!!!!!! 0 引言 数字IC设计或者FPGA在笔试、或者面试中的基础知识提问环节,考察的知识点范围还是比较广的,个人整理主要包括: 基本的V…

酷开系统——家庭场景下的智能营销系统!

随着人们生活方式的改变&#xff0c;以往传统的营销资源和渠道正在慢慢陷入一个“无用”的尴尬境地&#xff0c;而作为家庭娱乐中心的智能大屏&#xff0c;近两年所表现出来的数据和效果却逐渐备受企业和品牌方关注&#xff0c;有数据显示&#xff0c;智能大屏的家庭覆盖规模正…

vue基础

Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0…

QT 学习笔记(十六)

文章目录一、TCP 传文件流程图1. 服务器端流程2. 客户端流程二、TCP 传文件操作实现1. 服务器端2. 客户端3. TCP 传文件实现现象三、服务器端和客户端实现代码1. 主函数 main.c2. 服务器端头文件 serverwidget.h3. 服务器端源文件 serverwidget.cpp4. 客户端头文件 clientwidge…

如何用智能地教狗狗上厕所

背景 22年养了一只很可爱的小狗狗&#xff0c;我其实就一个问题&#xff1a;为啥这么可爱的狗狗会拉屎撒尿呀&#xff1f; 自从崽崽来了我们家之后&#xff0c;最让我们头疼的就是它乱拉、乱尿的问题了&#xff0c;以前会在家里到处乱来&#xff0c;最近一段时间好了很多&…

自动化测试Seleniums~1

一.什么是自动化测试 1.自动化测试介绍 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 将测试人员双手解放&#xff0c;将部分测…

【博客579】netfilter network flow 和 routing decision的网络流处理交互关系

netfilter网络流转&#xff08;network flow&#xff09;与路由决策&#xff08;routing decision&#xff09;的网络流处理交互关系 1、场景&#xff1a; 我们可以通过iptables来基于netfilter机制下发我们的hook处理函数&#xff0c;那么我们平时iptables的四表五链与报文的…