描述
给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。
分析
使用一趟归并即可。
代码
class PrintCommon {
public static void print(Node1 head1, Node1 head2) {
Node1 cur1 = head1.next; // cur1 初始为head1的第一个节点
Node1 cur2 = head2.next; // cur2 初始为head2的第一个节点
while (cur1 != null && cur2 != null) { // 有一个链表遍历完,循环结束
cur1 = cur1.element < cur2.element ? cur1.next : cur1; // 两个链表中,较小的当前节点向后移动
cur2 = cur2.element < cur1.element ? cur2.next : cur2;
if (cur1.element == cur2.element) { // 如果两个当前节点相等,则打印并一起向后移动
System.out.print(cur1.element + " ");
cur1 = cur1.next;
cur2 = cur2.next;
}
}
}
public static void main(String[] args) {
// 定义链表 head1
Node1 head1 = new Node1();
head1.add(3);
head1.add(5);
head1.add(6);
head1.add(9);
head1.add(11);
head1.add(13);
// 定义链表 head2
Node1 head2 = new Node1();
head2.add(5);
head2.add(6);
head2.add(7);
head2.add(8);
head2.add(9);
head2.add(11);
// 打印原链表
head1.print();
head2.print();
// 打印公共部分
print(head1, head2);
}
}
// 节点类
class Node1 {
public Integer element;
public Node1 next;
public Node1() {
this.element = null;
this.next = null;
}
public Node1(int element) {
this.element = element;
}
public void add(int element) {
Node1 newNode = new Node1(element);
Node1 tmp = this;
while (tmp.next != null) {
tmp = tmp.next;
}
newNode.next = tmp.next;
tmp.next = newNode;
}
public void print() {
Node1 tmp = this.next;
System.out.print("head -> ");
while (tmp != null) {
System.out.print(tmp.element + " -> ");
tmp = tmp.next;
}
System.out.println("null");
}
}
out:
head -> 3 -> 5 -> 6 -> 9 -> 11 -> 13 -> null
head -> 5 -> 6 -> 7 -> 8 -> 9 -> 11 -> null
5 6 9 11