该篇中链表的创建等操作看上一篇点这里
方法一:需创建新的链表
1.创建一个新的头结点
2.遍历两个链表,p代表head1的头结点,q代表head2的头结点
3.如果p的下一个节点的值<q的下一个节点的值,就在head1链表中删除p节点,并将
该节点插入到新链表中,新链表的指针后移(该程序中为h),否则的话就q节点执行上
述操作.
4. 任何一个链表遍历结束,循环停止,检查两个链表中是否还有剩下的节点,如果有
的话,肯定是比新链表中的所有值都大的,直接插入到新链表的末尾.
// 方法一:创建新链表
public static LinkedList hebing(LinkedList head1, LinkedList head2) {
// 获取俩个链表的头结点
HeroNode p = head1.getHead();
HeroNode q = head2.getHead();
// 创建一个新的链表
LinkedList head3 = new LinkedList();
HeroNode h = head3.getHead(); //头节点
// 遍历两个链表,总是选择小的插入到新链表中
while (p.next != null && q.next != null) {
if (p.next.no < q.next.no) {
h.next = p.next;
p.next = p.next.next;
} else {
h.next = q.next;
q.next = q.next.next;
}
h = h.next;
}
// 检查未遍历完的链表,有剩下的直接除头结点总体插入到新链表后边
if (p.next != null)
{
h.next = p.next;
p.next = null;
}
else
{
h.next = q.next;
q.next = null;
}
return head3;
}
方法二:不创建新链表
1.遍历两个链表,p代表head1的头结点,q代表head2的头结点
2.如果p的下一个节点的值<q的下一个节点的值,就在h1链表中删除p节点,并将该节点插入
到被插入链表中,被插入链表的两个指针后移(当前节点和当前节点的下一个节点).
3. 如果大于被插入链表的当前节点,原链表的指针一直后移,直到遇到比自己大的节点,或
者链表结束了,才停止遍历.
4. 如果原链表中有剩余节点,插入到被插入链表中.
// 方法二:在原链表上操作
public static LinkedList hebing1(LinkedList h1, LinkedList h2) {
// 获取两个链表的头结点
HeroNode p = h1.getHead();
HeroNode q = h2.getHead();
// 该指针用来记录被插入的链表的当前节点的后一个节点.
HeroNode l = q.next;
while(p.next!=null && q.next!=null){
// 小于被插入链表的当前节点时,该节点在原链表中删除,插入的被插入链表中,同时,被插入链表的指针后移.
if(p.next.no < q.next.no){
q.next = p.next;
p.next = p.next.next;
q.next.next = l;
}
// 如果大于被插入链表的当前节点,原链表的指针一直后移,直到遇到比自己大的节点,或者链表结束了,才停止遍历.
q = q.next;
l = q.next;
}
if(p.next != null){
q.next = p.next;
h1.getHead().next = null;
}
return h2;
}