思路如下图:
方块中的数字表示no,依据no进行排序。将head2的元素按照no按序加入head1。
因为单链表需要有序,可以增加一个addByOrder的方法,进行排序加入的元素。因为addByOrde的方法剔除了no相同的元素,所有合并单链表不考虑no相同的情况。
完整代码如下:
public class SingleList {
public static void main(String[] args) {
//添加元素
StudentNode student1 = new StudentNode(3, "jack");
StudentNode student2 = new StudentNode(5, "lucy");
StudentNode student3 = new StudentNode(6, "smith");
SingleListService singleListService = new SingleListService();
singleListService.addByOrder(student1);
singleListService.addByOrder(student2);
singleListService.addByOrder(student3);
singleListService.list();
System.out.println("==============================");
//添加元素
StudentNode student4 = new StudentNode(7, "neck");
StudentNode student5 = new StudentNode(2, "kit");
StudentNode student6 = new StudentNode(4, "cat");
StudentNode student7 = new StudentNode(1, "dog");
SingleListService singleListService1 = new SingleListService();
singleListService1.addByOrder(student4);
singleListService1.addByOrder(student5);
singleListService1.addByOrder(student6);
singleListService1.addByOrder(student7);
singleListService1.list();
System.out.println("=============合并后===============");
sumList(singleListService.getHead(), singleListService1.getHead());
singleListService.list();
}
// 合并两个有序单链表,将后一个单链表合并到前一个单链表中
public static void sumList(StudentNode head1, StudentNode head2){
//如果 head2.next 为空,表示无元素,退出
if (head2.next == null){
return;
}
//临时变量
StudentNode cur1 = head1;
StudentNode cur2 = head2.next;
StudentNode temp1 = null;
StudentNode temp2 = null;
//遍历
while (cur1 != null){
while (cur2 != null){
temp1 = cur2.next;
//如果 cur2.no < cur1.next.no 则将 cur2 加到 cur1 的后面
if (cur1.next != null && cur2.no < cur1.next.no){
temp2 = cur1.next;
cur1.next = cur2;
cur2.next = temp2;
// 如果 cur2.no > cur1.next.no,因为原序列有序,
// 表示cur2后面的所有元素都比cur1大,所以可以直接break
} else if (cur1.next != null && cur2.no > cur1.next.no){
break;
//如果cur1.next为空,表示cur1的后面已经没有元素,但是cur2不为空
//表示cur2比cur1的所有元素都大,直接加到最后
} else {
cur1.next = cur2;
}
cur2 = temp1;
}
// 因为改变cur1的结构,所以不采取临时变量
cur1 = cur1.next;
}
}
}
class SingleListService{
private StudentNode head = new StudentNode(0, "");
public StudentNode getHead() {
return head;
}
// 添加元素,如果no重复,则不添加
public void addByOrder(StudentNode studentNode){
//通过辅助指针,找到添加位置,位于添加位置的前一个节点
StudentNode temp = head;
boolean flag = false; //标志添加的编号是否存在
while (true){
//说明已经在列表最后
if (temp.next == null){
break;
}
if (temp.next.no > studentNode.no){
//位置找到
break;
} else if (temp.next.no == studentNode.no){
//说明编号存在
flag = true;
break;
}
temp = temp.next; //后移
}
//判断 flag 的值
if (flag){
System.out.printf("插入的编号%d已存在\n", studentNode.no);
} else {
studentNode.next = temp.next;
temp.next = studentNode;
}
}
//遍历
public void list(){
//判断链表是否为空
if (head.next == null){
System.out.println("链表为空");
return;
}
StudentNode temp = head.next;
//遍历
while (true){
if (temp == null){
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
class StudentNode{
public int no;
public String name;
public StudentNode next; //指向下一个节点
public StudentNode(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "StudentNode{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
最后的结果为:
StudentNode{no=3, name='jack'}
StudentNode{no=5, name='lucy'}
StudentNode{no=6, name='smith'}
==============================
StudentNode{no=1, name='dog'}
StudentNode{no=2, name='kit'}
StudentNode{no=4, name='cat'}
StudentNode{no=7, name='neck'}
StudentNode{no=8, name='neck'}
=============合并后===============
StudentNode{no=1, name='dog'}
StudentNode{no=2, name='kit'}
StudentNode{no=3, name='jack'}
StudentNode{no=4, name='cat'}
StudentNode{no=5, name='lucy'}
StudentNode{no=6, name='smith'}
StudentNode{no=7, name='neck'}
StudentNode{no=8, name='neck'}
还在学习中,有问题辛苦指正。