算法-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; } }