算法-20打印俩个有序链表的公共部分
描述
给定两个升序链表,打印两个升序链表的公共部分。
输入描述:
第一个链表的长度为 n。
第二个链表的长度为 m。
链表结点的值为 val。
第二个链表的长度为 m。
链表结点的值为 val。
输出描述:
输出一行整数表示两个升序链表的公共部分的值 (按升序输出)。
示例1
输入: 4 1 2 3 4 5 1 2 3 5 6 输出: 1 2 3
思路
本题因为是有序链表,并且给定了两个链表的头指针head1和head2,所以只要控制2个指针的移动就行了:
- 如果head1的值小于head2的值,则head1向下移动一个;如果大于则是head2移动一个
- 如果head1的值与head2的值相等,则输出该值,head1与head2同时移动一个
- 当head1或者head2为null时停止
另外要注意一下,这个公共部分不一定要连续,我一开始受牛客上面案例的影响,第一次提交做错了。并且看书上解析,好像默认就是升序链表。那么降序的话道理是一样的。
代码如下:
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); sc.nextLine(); StringBuilder sb = new StringBuilder(); String[] strArr = sc.nextLine().split(" "); Node node1 = Node.trans(strArr); sc.nextLine(); String[] strArr2 = sc.nextLine().split(" "); Node node2 = Node.trans(strArr2); printCommonPart(node1,node2); } public static void printCommonPart(Node head1,Node head2) { while(head1 != null && head2 != null) { if(head1.value<head2.value){ head1 = head1.next; } else if(head1.value>head2.value){ head2 = head2.next; } else{ System.out.print(head1.value+" "); head1 = head1.next; head2 = head2.next; } } } } class Node { public int value; public Node next; public Node(int data) { this.value = data; } static Node trans(String[] nums) { Node head = new Node(Integer.parseInt(nums[0])); Node cur = head; for(int i=1;i<nums.length;i++) { cur.next = new Node(Integer.parseInt(nums[i])); cur = cur.next; } return head; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2015-07-06 FastDFS安装配置
2015-07-06 nginx+lua安装配置