|
发表于 2024-3-8 12:19:35
|
显示全部楼层
题目一:合并有序链表
- public class SingleLinkList {
- LinkNode head;
- int length;
- // 构造方法
- public SingleLinkList() {
- head = null;
- length = 0;
- }
- // 链表初始化
- public void LinkListInit() {
- head = new LinkNode(0);
- LinkNode p = head;
- for (int i = 1; i <= 5; i++) {
- LinkNode newNode = new LinkNode(i * 2); // 创建新节点
- p.next = newNode; // 将新节点连接到链表尾部
- p = newNode; // 移动p指针到新节点
- length++;
- }
- }
- // 合并两个有序链表
- public void LinkListUnion(SingleLinkList listB) {
- LinkNode p = head.next; // 指向链表A的第一个节点
- LinkNode q = listB.head.next; // 指向链表B的第一个节点
- while (p != null && q != null) { // 两个链表都还未遍历完
- if (p.val < q.val) { // 如果链表A的当前节点小于链表B的当前节点
- if (p.next != null && p.next.val == q.val) { // 判断A链表的下一个节点是否与B链表的当前节点相同
- p.next = p.next.next; // 相同则删除A链表的下一个节点
- } else {
- p = p.next; // 否则移动A链表的指针
- }
- } else if (p.val > q.val) { // 如果链表A的当前节点大于链表B的当前节点
- LinkNode newNode = new LinkNode(q.val); // 创建新节点
- newNode.next = p; // 将新节点插入到链表A中
- head.next = newNode; // 更新头部指针
- q = q.next; // 移动B链表的指针
- length++; // 链表长度加一
- } else { // 如果链表A的当前节点等于链表B的当前节点
- q = q.next; // 移动B链表的指针
- }
- }
- if (q != null) { // 如果B链表还有剩余节点
- while (q != null) {
- LinkNode newNode = new LinkNode(q.val); // 创建新节点
- newNode.next = null;
- p.next = newNode; // 将新节点连接到链表A的尾部
- p = newNode; // 移动A链表的指针
- q = q.next; // 移动B链表的指针
- length++; // 链表长度加一
- }
- }
- }
- // 打印链表
- public void printLinkList() {
- LinkNode p = head.next;
- while (p != null) {
- System.out.print(p.val + " -> ");
- p = p.next;
- }
- System.out.println("null");
- }
- public static void main(String[] args) {
- SingleLinkList listA = new SingleLinkList();
- SingleLinkList listB = new SingleLinkList();
- listA.LinkListInit();
- listB.LinkListInit();
- System.out.println("合并前:");
- System.out.print("链表A: ");
- listA.printLinkList();
- System.out.print("链表B: ");
- listB.printLinkList();
- listA.LinkListUnion(listB);
- System.out.println("合并后:");
- System.out.print("链表A: ");
- listA.printLinkList();
- }
- }
复制代码
运行结果:
合并前:
链表A: 2 -> 4 -> 6 -> 8 -> 10 -> null
链表B: 2 -> 4 -> 6 -> 8 -> 10 -> null
合并后:
链表A: 2 -> 4 -> 6 -> 8 -> 10 -> null
题目二:合并有序顺序表
- public class SeqListUnion {
- static int[] seqListA = {1, 3, 5, 7, 9};
- static int[] seqListB = {2, 4, 6, 8, 10};
- static int[] seqListC = new int[seqListA.length + seqListB.length]; // 定义新表
- public static void SeqListUnion() {
- int i = 0, j = 0, k = 0;
- while (i < seqListA.length && j < seqListB.length) { // 两个表都未遍历完
- if (seqListA[i] < seqListB[j]) { // 如果A表的当前元素小于B表的当前元素
- if (i == 0 || seqListA[i] != seqListC[k - 1]) { // 判断新表中的最后一个元素是否与当前元素相同
- seqListC[k++] = seqListA[i]; // 不相同则将当前元素添加到新表中
- }
- i++;
- } else if (seqListA[i] > seqListB[j]) { // 如果A表的当前元素大于B表的当前元素
- if (j == 0 || seqListB[j] != seqListC[k - 1]) { // 判断新表中的最后一个元素是否与当前元素相同
- seqListC[k++] = seqListB[j]; // 不相同则将当前元素添加到新表中
- }
- j++;
- } else { // 如果A表的当前元素等于B表的当前元素
- if (i == 0 || seqListA[i] != seqListC[k - 1]) { // 判断新表中的最后一个元素是否与当前元素相同
- seqListC[k++] = seqListA[i];
- }
- i++;
- j++;
- }
- }
- while (i < seqListA.length) {
- if (seqListA[i] != seqListC[k - 1]) {
- seqListC[k++] = seqListA[i];
- }
- i++;
- }
- while (j < seqListB.length) {
- if (seqListB[j] != seqListC[k - 1]) {
- seqListC[k++] = seqListB[j];
- }
- j++;
- }
- for (int m = 0; m < k; m++) { // 打印新表
- System.out.print(seqListC[m] + " ");
- }
- }
- public static void main(String[] args) {
- System.out.print("合并后的有序顺序表:");
- SeqListUnion();
- }
- }
复制代码
运行结果:
合并后的有序顺序表:1 2 3 4 5 6 7 8 9 10
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|