"Coding Interview Guide"--打印两个有序链表的公共部分

题目

  给定两个有序链表的头指针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 }

 

来源:左程云老师《程序员代码面试指南》

posted @ 2019-05-15 21:37  Latuper  阅读(153)  评论(0编辑  收藏  举报