Java实现有序集合合并与交集算法(顺序表+单链表)
### 📌 1. 顺序表合并(递增有序并集) **算法思路**: 利用双指针遍历两个有序顺序表,比较当前元素大小,将较小者加入结果表,若相等则只加入一次。时间复杂度为 *O(m+n)*。 ```java import java.util.Arrays; public class OrderedListMerge { public static int[] mergeOrderedArrays(int[] A, int[] B) { int i = 0, j = 0, k = 0; int[] C = new int[A.length + B.length]; // 预分配最大可能空间 while (i < A.length && j < B.length) { if (A[i] < B[j]) { C[k++] = A[i++]; } else if (A[i] > B[j]) { C[k++] = B[j++]; } else { C[k++] = A[i++]; // 相等时只保留一个 j++; } } // 复制剩余元素 while (i < A.length) C[k++] = A[i++]; while (j < B.length) C[k++] = B[j++]; // 返回实际长度数组(Java需手动处理) return Arrays.copyOf(C, k); } public static void main(String[] args) { int[] A = {1, 3, 5, 7}; int[] B = {1, 2, 4, 5, 7}; int[] C = mergeOrderedArrays(A, B); System.out.println("并集结果: " + Arrays.toString(C)); // [1, 2, 3, 4, 5, 7] } } ``` **关键点**: - 使用 `Arrays.copyOf` 截断未使用的数组空间。 - 测试用例验证了重复元素处理逻辑。 --- ### 📌 2. 单链表求交(原地操作) **算法思路**: 双指针遍历两个链表,当元素相等时加入结果链表(通过修改指针),否则移动较小元素的指针。时间复杂度 *O(m+n)*,空间复杂度 *O(1)*。 ```java class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public class OrderedListIntersection { public static ListNode getIntersection(ListNode A, ListNode B) { ListNode dummy = new ListNode(0); // 虚拟头节点简化操作 ListNode tail = dummy; while (A != null && B != null) { if (A.val < B.val) { A = A.next; } else if (A.val > B.val) { B = B.next; } else { tail.next = A; // 直接复用A的节点 tail = tail.next; A = A.next; B = B.next; tail.next = null; // 断开原链表后续连接 } } return dummy.next; } // 辅助方法:打印链表 public static void printList(ListNode head) { while (head != null) { System.out.print(head.val + " "); head = head.next; } System.out.println(); } public static void main(String[] args) { // 构建测试链表 A: 1->3->5->7 ListNode A = new ListNode(1); A.next = new ListNode(3); A.next.next = new ListNode(5); A.next.next.next = new ListNode(7); // 构建测试链表 B: 1->2->4->5->7 ListNode B = new ListNode(1); B.next = new ListNode(2); B.next.next = new ListNode(4); B.next.next.next = new ListNode(5); B.next.next.next.next = new ListNode(7); ListNode C = getIntersection(A, B); System.out.print("交集结果: "); printList(C); // 1 5 7 } } ``` **关键点**: - **原地操作**:直接复用 `A` 链表的节点,避免新建节点。 - **断开连接**:每次添加节点后需将其 `next` 置为 `null`,防止原链表后续节点被意外包含。 - **虚拟头节点**:简化链表头部插入操作。 --- ### 🚀 开发建议 1. **边界检查**:处理空链表/数组时需提前返回。 2. **泛型支持**:可将 `int` 改为泛型 `<T extends Comparable<T>>` 以支持更多数据类型。 3. **单元测试**:补充测试用例(如完全不重叠、完全重叠、包含负数等)。 4. **性能优化**:顺序表合并时若已知两表长度差异大,可优先遍历较短表。 ######[AI写代码神器 | 1247点数解答 | 2026-03-25 10:35:22]
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)408
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)310
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1147
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)345
- Java 实现仿 Windows 资源管理器:文件管理器功能全解析与代码示例(字节豆包 | 623点数解答 | 2025-01-01 14:59:04)250
- C#工程师必知:数组、链表、哈希、队列、栈数据结构优缺点大揭秘! (百度文心 | 561点数解答 | 2023-11-09 17:56:30)264
- 重新定义字母大小关系:让 “L 队” 字典序小于 “某 E” 的代码实现与分析(字节豆包 | 595点数解答 | 2025-12-03 19:44:59)66
- 深入解析格雷码生成算法:递归求解与代码实现(DeepSeek | 443点数解答 | 2026-01-05 12:21:49)52
- Java JSP 代码:用 List 存储 Map 集合并循环添加姓名和年龄(GPT | 240点数解答 | 2024-11-25 09:17:43)243
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)313
- "Java Code: Uncovering Stock Statistics through CSV File Reading"(字节豆包 | 66点数解答 | 2024-11-13 15:31:04)323
- 巧用 JS 脚本找出集合 [1,2,2,3,3,5] 中的重复元素( | 502点数解答 | 2024-04-01 18:01:38)235