目录
题目:
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。例如,输入链表1:1、3、5、7,链表2:2、4、6、8,则合并之后的升序链表如链表3:1、2、3、4、5、6、7、8所示。链表节点定义如下:struct ListNode
{
int value;
ListNode next;
}
思路:
首先分析合并两个链表的过程。我们分析合并两个链表的头节点开始。链表1的头节点的值小于链表2的头节点的值,因此链表1的头节点将是合并后链表的头节点。我们继续合并两个链表中剩余的节点。在两个链表中剩下的节点依然是排序的,因此合并这两个链表的步骤和前面的步骤是一样的。我们还是比较两个头节点的值。此时链表2的头节点的值小于链表1的头节点的值,因此链表2的头节点的值将是合并剩余节点得到的链表的节点。我们把这个节点和前面合并链表时得到的链表的尾节点链接起来。
当我们得到两个链表中值较小的头节点并把它链接到已经合并的链表之后,两个链表剩余的节点依然是排序的,因此合并的步骤和之前的步骤是一样的。这就是典型的递归过程,我们可以定义递归函数完成这一合并过程。
步骤:
略代码:
package test;
public class ListNodeMerge {
public static void main(String[] args) {
ListNode ln1 = new ListNode();
ListNode ln2 = new ListNode();
ListNode ln3 = new ListNode();
ListNode ln4 = new ListNode();
ln1.value = 1;
ln1.next = ln2;
ln2.value = 3;
ln2.next = ln3;
ln3.value = 5;
ln3.next = ln4;
ln4.value = 7;
ListNode ln5 = new ListNode();
ListNode ln6 = new ListNode();
ListNode ln7 = new ListNode();
ListNode ln8 = new ListNode();
ln5.value = 2;
ln5.next = ln6;
ln6.value = 4;
ln6.next = ln7;
ln7.value = 6;
ln7.next = ln8;
ln8.value = 8;
ListNode listNode = merge(ln1, ln5);
while(listNode != null) {
System.out.println(listNode.value);
listNode = listNode.next;
}
}
public static ListNode merge(ListNode pHead1, ListNode pHead2) {
if (pHead1 == null)
return pHead2;
else if (pHead2 == null)
return pHead1;
ListNode pMergedHead = null;
if(pHead1.value < pHead2.value) {
pMergedHead = pHead1;
pMergedHead.next = merge(pHead1.next, pHead2);
} else {
pMergedHead = pHead2;
pMergedHead.next = merge(pHead1, pHead2.next);
}
return pMergedHead;
}
static class ListNode {
int value;
ListNode next;
}
}