给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。
思路:
用两个指针指向两个链表的第一的节点,哪一个的数值小,这个指针就往后移一位。两个数相等时,打印这个数并且两个指针同时后移,当某一个指针为空时结束循环。
package LinkedTest;
public class PrintCommomPart {
public static void main(String[] args) {
Node node1 = new Node(1, 15);
Node node2 = new Node(2, 17);
Node node3 = new Node(3, 23);
Node node4 = new Node(4, 29);
Node node5 = new Node(5, 37);
Node node6 = new Node(6, 55);
Node node7 = new Node(7, 59);
Node node8 = new Node(8, 70);
Node node01 = new Node(1, 5);
Node node02 = new Node(2, 15);
Node node03 = new Node(3, 30);
Node node04 = new Node(4, 37);
Node node05 = new Node(5, 48);
Node node06 = new Node(6, 50);
Node node07 = new Node(7, 59);
Node node08 = new Node(8, 80);
System.out.println("****************链表1***********************");
ManageNode link1 = new ManageNode();
link1.addNode(link1.getHead1(), node1);
link1.addNode(link1.getHead1(), node2);
link1.addNode(link1.getHead1(), node3);
link1.addNode(link1.getHead1(), node4);
link1.addNode(link1.getHead1(), node5);
link1.addNode(link1.getHead1(), node6);
link1.addNode(link1.getHead1(), node7);
link1.addNode(link1.getHead1(), node8);
link1.showLinked(link1.getHead1());
System.out.println("****************链表2***********************");
ManageNode link2 = new ManageNode();
link2.addNode(link2.getHead2(), node01);
link2.addNode(link2.getHead2(), node02);
link2.addNode(link2.getHead2(), node03);
link2.addNode(link2.getHead2(), node04);
link2.addNode(link2.getHead2(), node05);
link2.addNode(link2.getHead2(), node06);
link2.addNode(link2.getHead2(), node07);
link2.addNode(link2.getHead2(), node08);
link2.showLinked(link2.getHead2());
ManageNode.printCommomPart(link1.getHead1(),link2.getHead2());
}
}
class ManageNode {
private Node head1 = new Node(0, 0);
public Node getHead1() {
return head1;
}
private Node head2 = new Node(0, 0);
public Node getHead2() {
return head2;
}
public void addNode(Node head, Node node) {
Node temp = head;
while (true) {
//找到最终的尾结点
if (temp.next == null) {
break;
}
//如果不为空,节点后移一个
temp = temp.next;
}
temp.next = node;
}
public void showLinked(Node head) {
if (head.next == null) {
System.out.println("链表为空");
return;
}
Node temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
public static void printCommomPart(Node head1,Node head2){
if (head1.next==null || head2.next==null){
return;
}
Node temp1=head1.next;
Node temp2=head2.next;
while (temp1!=null&&temp2!=null){
if (temp1.message==temp2.message){
System.out.println(temp1.message);
temp1=temp1.next;
temp2=temp2.next;
}else if (temp1.message>temp2.message){
temp2=temp2.next;
}else {
temp1=temp1.next;
}
}
}
}
class Node {
public int no;
public int message;
Node next;
public Node(int no, int message) {
this.no = no;
this.message = message;
}
@Override
public String toString() {
return "Node1{" +
"no=" + no +
", massage='" + message + '\'' +
'}';
}
}
运行结果
LinkedTest.PrintCommomPart
****************链表1***********************
Node1{no=1, massage='15'}
Node1{no=2, massage='17'}
Node1{no=3, massage='23'}
Node1{no=4, massage='29'}
Node1{no=5, massage='37'}
Node1{no=6, massage='55'}
Node1{no=7, massage='59'}
Node1{no=8, massage='70'}
****************链表2***********************
Node1{no=1, massage='5'}
Node1{no=2, massage='15'}
Node1{no=3, massage='30'}
Node1{no=4, massage='37'}
Node1{no=5, massage='48'}
Node1{no=6, massage='50'}
Node1{no=7, massage='59'}
Node1{no=8, massage='80'}
15
37
59
Process finished with exit code 0