题目: 给定两个有序链表的头指针head1和head2,打印这两个链表的公共部分。
解法:
- 如果head1的值小于head2,则head1往下移动。
- 如果head2的值小于head1,则head2往下移动。
- 如果head1和head2的值相等,则打印这个值,然后head1与head2都往下移动。
- head1或head2有任何一个移动到null,整个过程停止。
代码:
class Node{
public int value;
public Node next;
public Node(int data) {
this.value = data;
}
}
//打印两个有序链表的公共部分
public void printCommonPart(Node head1, Node head2) {
System.out.println("Common Part:");
while(head1 != null && head2 != null) {
if(head1.value < head2.value) { // head1指向后继结点
head1 = head1.next;
}else if(head1.value > head2.value) { //head2指向后继结点
head2 = head2.next;
}else {
System.out.println(head1.value + " "); //值相同,打印公共的部分
head1 = head1.next;
head2 = head2.next;
}
}
}
测试代码:
构造一个100个节点的单链表
public static Node createLinkList() {
Node head = new Node((int)(Math.random() * 10));
int n = 0;
while(n < 100) {
int data = (int)(Math.random() * 10);
Node node = new Node(data);
node.next = head.next;
head.next = node;
n++;
}
return head;
}
public static void main(String[] args) {
Node head1 = createLinkList();
Node head2 = createLinkList();
printCommonPart(head1,head2);
}
结果:
Common Part: 8 9 8 9 6 6 9 9 9 9 9 9 8 8 9 2 9 9 9