问题描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序。
思路
若链表1的头节点小于链表2的头节点,则小值的头节点成为合并后链表的头节点。两个链表在第一次合并后,剩下的节点依然是排序的,因此合并这两个链表的步骤和前面一样,比较头节点的值,再把小值的头节点插入合并链表中。可以发现,这个合并的过程是重复的,可以定义一个递归函数完成这一系列的合并操作。
确定解决办法后,考虑函数的鲁棒性,每当代码试图访问空指针指向的内存时程序都会崩溃,从而导致鲁棒性问题。在该问题中,传入的两个头节点都有可能为空,所以我们要对空链表进行处理。如果第一个链表为空链表,那么直接返回第二个链表即可;如果第二个链表为空链表,那么直接返回第一个链表;如果两个链表都是空链表,则返回空。
以下是针对上述问题的参考代码:
using System;
namespace 合并两个排序的链表
{
public class ListNode
{
public int val;
public ListNode next;
public ListNode(int x)
{
val = x;
}
}
class Program
{
static void Main(string[] args)
{
//Test1:输入的两个链表有多个节点
Console.WriteLine("Test1:");
ListNode list1 = null, list2 = null;
CreateList(ref list1, ref list2);
PrintList(list1);
PrintList(list2);
list1 = Merge(list1,list2);
PrintList(list1);
//Test2:两个链表有空指针
Console.WriteLine("Test2:");
list1 = null;
CreateList(ref list1, ref list2);
list2 = null;
PrintList(list1);
PrintList(list2);
list1 = Merge(list1, list2);
PrintList(list1);
//test3:两个链表有且只有一个节点
Console.WriteLine("Test3:");
list1 = new ListNode(1);
list2 = new ListNode(1);
PrintList(list1);
PrintList(list2);
list1 = Merge(list1, list2);
PrintList(list1);
}
/// <summary>
/// 合并有序链表
/// </summary>
/// <param name="pHead1">链表1的头节点</param>
/// <param name="pHead2">链表2的头节点</param>
/// <returns>合并的头节点</returns>
public static ListNode Merge(ListNode pHead1, ListNode pHead2)
{
if (pHead1 == null)
return pHead2;
else if (pHead2 == null)
return pHead1;
ListNode merge = null;
if (pHead1.val < pHead2.val)
{
merge = pHead1;
merge.next = Merge(pHead1.next, pHead2);
}
else
{
merge = pHead2;
merge.next = Merge(pHead1, pHead2.next);
}
return merge;
}
/// <summary>
/// 创建链表
/// </summary>
/// <param name="pHead1">链表1的头节点</param>
/// <param name="pHead2">链表2的头节点</param>
public static void CreateList(ref ListNode pHead1,ref ListNode pHead2)
{
ListNode list1 = new ListNode(1);
if (pHead1 == null)
pHead1 = list1;
ListNode list2 = new ListNode(0);
if (pHead2 == null)
pHead2 = list2;
for(int i = 2; i <= 10; i++)
{
ListNode temp = new ListNode(i);
if (i % 2 == 0)
{
list2.next = temp;
list2 = temp;
}
else
{
list1.next = temp;
list1 = temp;
}
}
}
/// <summary>
/// 打印链表
/// </summary>
/// <param name="pHead">链表的头节点</param>
public static void PrintList(ListNode pHead)
{
if (pHead == null)
{
Console.WriteLine("null");
return;
}
ListNode list = pHead;
while (list != null)
{
Console.Write(list.val + "-->");
list = list.next;
}
Console.WriteLine();
}
}
}