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