数据结构与算法设计综合训练上机题目1
标签: DS

题目一
一、给定一组整数(以-1结束输入),长度为n(1≤n≤100),从输入读取建立对应的单向链表,并将链表逆转后输出。
输入:1,2,3,4,5,-1
输出:5,4,3,2,1
要求:
①逆转操作需原地进行,不得新建数组或辅助链表;
②时间复杂度要求: O(n);
③空间复杂度要求: O(1)。
提示:
①可采用三指针法实现链表逆转:prev、curr、next;
②建议编写辅助函数:
createList():从输入创建链表
reverseList():逆转链表
printList():输出链表
代码:
import java.util.Scanner;
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
public class ReverseLinkedList {
public static ListNode createList(Scanner scanner) {
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
while (scanner.hasNextInt()) {
int val = scanner.nextInt();
if (val == -1) {
break;
}
ListNode node = new ListNode(val);
tail.next = node;
tail = node;
}
return dummy.next;
}
public static ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
public static void printList(ListNode head) {
if (head == null) {
System.out.println("链表为空");
return;
}
while (head != null) {
System.out.print(head.val);
if (head.next != null) {
System.out.print(",");
}
head = head.next;
}
System.out.println();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入整数序列(以-1结束):");
ListNode head = createList(scanner);
System.out.print("原链表:");
printList(head);
head = reverseList(head);
System.out.print("逆转后:");
printList(head);
scanner.close();
}
}
题目二
二、已知两个递增有序的单向链表A和B,长度分别为m和n(1≤m, n≤100),将它们合并为一个新的递增有序链表C,要求在原链表基础上进行合并(不得新建节点)。
输入:链表A:1 3 5 7 -1;链表B:2 4 6 8 -1
输出:1 2 3 4 5 6 7 8
要求:
①使用单向链表实现;
②合并操作在原链表上完成,不得新建节点;
③输出合并后的有序链表;
④时间复杂度要求:O(m + n)
⑤空间复杂度要求:O(1)
提示:
①可使用两个指针 pa 和 pb 分别遍历链表 A 和 B;
②比较节点值大小,将较小的节点链接到新链表尾部;
③注意处理其中一个链表提前遍历完的情况;
④可使用带头结点法或双指针法实现。
代码:
import java.util.Scanner;
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
public class MergeSortedLists {
public static ListNode createList(Scanner scanner) {
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
while (scanner.hasNextInt()) {
int val = scanner.nextInt();
if (val == -1) {
break;
}
ListNode node = new ListNode(val);
tail.next = node;
tail = node;
}
return dummy.next;
}
public static ListNode mergeTwoLists(ListNode listA, ListNode listB) {
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
ListNode pa = listA;
ListNode pb = listB;
while (pa != null && pb != null) {
if (pa.val <= pb.val) {
tail.next = pa;
pa = pa.next;
} else {
tail.next = pb;
pb = pb.next;
}
tail = tail.next;
}
if (pa != null) {
tail.next = pa;
}
if (pb != null) {
tail.next = pb;
}
return dummy.next;
}
public static void printList(ListNode head) {
if (head == null) {
System.out.println("链表为空");
return;
}
while (head != null) {
System.out.print(head.val);
if (head.next != null) {
System.out.print(" ");
}
head = head.next;
}
System.out.println();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个递增有序链表A(以-1结束):");
ListNode listA = createList(scanner);
System.out.print("链表A:");
printList(listA);
System.out.println("\n请输入第二个递增有序链表B(以-1结束):");
ListNode listB = createList(scanner);
System.out.print("链表B:");
printList(listB);
ListNode mergedList = mergeTwoLists(listA, listB);
System.out.print("\n合并后的有序链表:");
printList(mergedList);
scanner.close();
}
}