考察点
链表
知识点
链表的遍历
题目
分析
题目要求合并俩个排序的列表,很自然的可以想到从俩个链表的头结点开始比较,假设a链表的头结点比b链表的头结点小,那么a链表的头结点就是合并后链表的头结点,接下来也是很自然的可以想到要确定这个合并链表头结点的后继结点,a链表的头结点已经排好序了,b链表的头结点还没有确定好位置,因此再接着比较a链表头结点的后继结点和b链表的头结点,这个过程可以通过递归的方式完成
public class Seventeen {
public static void main(String[] args) {
LinkList lista = new LinkList();
lista.addNode(1);
lista.addNode(3);
lista.addNode(5);
lista.addNode(7);
LinkList listb = new LinkList();
listb.addNode(2);
listb.addNode(4);
listb.addNode(6);
listb.addNode(8);
LinkNode head = merge(lista.head,listb.head);
print(head);
}
public static LinkNode merge(LinkNode nodea,LinkNode nodeb) {
if (nodea == null) {
return nodeb;
}
if (nodeb == null) {
return nodea;
}
LinkNode pHead = null;
if (nodea.val < nodeb.val) {
pHead = nodea;
pHead.next = merge(nodea.next,nodeb);
} else {
pHead = nodeb;
pHead.next = merge(nodea,nodeb.next);
}
return pHead;
}
//正序打印
public static void print(LinkNode node) {
while(node != null) {
System.out.print(node.val);
System.out.print(" ");
node = node.next;
}
System.out.println();
}
}
public class LinkNode {
int val;
LinkNode next;
public LinkNode(int data) {
this.val = data;
this.next = null;
}
}
public class LinkList {
LinkNode head;
public LinkList() {
this.head = null;
}
//添加元素
public void addNode(int data) {
LinkNode node = new LinkNode(data);
if (this.head == null) {
this.head = node;
} else {
LinkNode cur = this.head;
while(cur.next != null) {
cur = cur.next;
}
cur.next = node;
}
}
}