【题目】
给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。
【分析】
链表可能为空也可能非空,而对于空链表程序不需要进行任何操作;若是非空链表,因为链表有序,所以要么是递增,要么是递减。
假设两个链表元素是有序递增,用head1和head2依次访问链表元素,那么有四种情况:
1、如果head1的值小于head2的值,则说明需要在链表1的后续节点中寻找公共节点,此时向后移动head1,不必移动head2;
2、如果head1的值大于head2的值,则说明需要在链表2的后续节点中寻找公共节点,此时向后移动head2,不必移动head1;
3、如果head1的值等于head2的值,说明当前节点正是这两个链表的公共部分,打印,然后head1和head2同时向后移,寻找下一个公共节点;
4、如果head1或者head2任何一个移动到null,说明已完成寻找公共节点的过程,此时整个算法结束。
1 public void printCommon(Node head1, Node head2) 2 { 3 while(head1 != null && head2 != null) 4 { 5 if(head1.value < head2.value) 6 { 7 head1 = head1.next; 8 } 9 else if(head1.value > head2.value) 10 { 11 head2 = head2.next; 12 } 13 else 14 { 15 System.out.println(head1.value); 16 head1 = head1.next; 17 head2 = head2.next; 18 } 19 } 20 }
来源:左程云老师《程序员代码面试指南》