​welcome to my blog​

程序员代码面试指南第二版 12.打印两个升序链表的公共部分

题目描述

题目描述
给定两个升序链表,打印两个升序链表的公共部分。

输入描述:
第一个链表的长度为 n。

第二个链表的长度为 m。

链表结点的值为 val。

输出描述:
输出一行整数表示两个升序链表的公共部分的值 (按升序输出)。

示例1

输入
4
1 2 3 4
5
1 2 3 5 6

输出
1 2 3

第一次做; 核心:两个指针p1,p2分别指向两个链表的开头, 谁小移动谁; p1.val<p2.val则p1向下移动一个, p1.val>p2.val则p2向下移动一下, p1.val==p2.val则打印val并且p1,p2都向下移动一下

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
ListNode head1 = new ListNode(0);
String[] str = sc.nextLine().split(" ");
ListNode curr = head1;
for(int i=0; i<n; i++){
curr.next = new ListNode(Integer.parseInt(str[i]));
//update
curr = curr.next;
}
ListNode head2 = new ListNode(0);
curr = head2;
int m = Integer.parseInt(sc.nextLine());
str = sc.nextLine().split(" ");
for(int i=0; i<m; i++){
curr.next = new ListNode(Integer.parseInt(str[i]));
//update
curr = curr.next;
}
//开始找链表的公共部分
ListNode p1 = head1.next, p2 = head2.next;
while(p1!=null && p2!=null){
if(p1.val < p2.val)
p1 = p1.next;
else if(p1.val > p2.val)
p2 = p2.next;
else{
System.out.print(p1.val+" ");
p1 = p1.next;
p2 = p2.next;
}
}
}
public static class ListNode{
int val;
ListNode next = null;
ListNode(int val){
this.val = val;
}
}
}