最近学习数据结构的算法的过程中,遇到了一个题,然后视频讲解的老师并没有给出答案(可能是我没找到),于是我就自己动手实现了一波。如有问题,请大家支点
核心思路
- 校验两个链表的长度,如果都为null,直接返回
- 如果链表1或者链表2中有一个链表的节点的next==null
- 如果链表1节点的next为null,则之间将链表2的节点加入到返回结果的链表中
- 如果链表2节点的next为null,则之间将链表1的节点加入到返回结果的链表中
- 如果链表1的节点的next和链表2节点的next都不是null
- 对比两个节点的值,寻找到小的节点,放入到返回结果的链表中,继续遍历
- 当链表1和链表2的next节点都为null时,则停止遍历
核心代码在最下面,注释很全,相信大家看注释就可以明白!!!!!
链表类
/**
* 定义SingleLinkedList,管理我们的英雄
*/
class SingleLinkedList{
//初始化一个头节点,头节点不要动,不存放具体的数据
private HeroNode head = new HeroNode(0,"","");
public HeroNode getHead() {
return head;
}
/**
* 添加节点到单链表
* 思路:当不考虑编号顺序
* 1.找到当前链接的最后节点
* 2.将最后这个节点的next指向新的节点
* @param heroNode
*/
public void add(HeroNode heroNode){
//因为head节点不能动,因此我们需要一个复制遍历temp
HeroNode temp = this.head;
//遍历链表,找到最后
while (true){
//找到链表的最后
if(temp.next == null){
break;
}
//如果没有找到,就将temp后移动
temp = temp.next;
}
//当退出while循环时,temp就指向链表的最后
temp.next = heroNode;
}
/**
* 变量单链表
*/
public void show(){
//判断链表是否为null
if(head.next == null){
System.out.println("链表为null");
return;
}
//因为头节点不能动,因为我们需要一个辅助遍历来遍历
HeroNode temp = head;
while ((temp = temp.next) != null){
System.out.println(temp);
}
}
/**
* 按照顺序将节点添加到单链表中
* 第二种方式在添加英雄时,根据排名将英雄插入到指定位置
* (如果有这个排名,则添加失败,并给出提示)
* @param heroNode
*/
public void addByOrder(HeroNode heroNode){
//1.定义一个变量,存放头节点,因为头节点不能动,因为我们仍然通过一个辅助指针(变量)来帮助找到添加的位置
//因为单链表,因我我们找的temp是位于添加位置的前一个节点,否则插入不了
HeroNode temp = this.head;
//定义flag作为是否重复的标志
boolean flag = false;
while (true){
//说明已经遍历到节点末尾,或者是空链表
if(temp.next == null){
break;
}
//位置找到,就在temp的后面插入
if(temp.next.no > heroNode.no)