算法:
将两个递增的有序链表合并成为一个递增的有序链表。
要求:
//1.要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。
//2.并且表中不允许有重复的数据。
我的想法是 把算法函数 构建在单链表类里面。
函数的形参同样设置一个单链表类变量。
那么,把形参的链表和引用函数的本体链表作为链表合并的两个链表。
其中假定两个链表均为递增的的有序链表(呼应算法前提)。
并且以引用函数的本体链表作为两链表合并的存储空间。
作为形参的链表在下文称为外来链表。
在算法内部中,先设置两个指针变量,一个指向本体链表的头结点,一个指向外来链表的头结点。
以头结点作为初始指针是为了方便链表比较插入操作的方便
接下来运用循环操作,循环比较两指针分别对应链表结点数据域的大小,
若本体链表的指针(下文统一称指针p)的下一个结点指向的数值大于外来链表的指针(下文统一称指针q)的下一个结点指向的数值,那么说明要把外来链表的一个比较小的数插入到本体链表的一个比较大的数前面,即要把指针q指向的下一个结点插入到指针p的下一个结点处。
若上述比较的数值相等,则呼应算法前提中的“表中不允许有重复的数据”,不作插入操作,并令指针p指向下一个结点。
若上述比较的数值中,指针p的下一个结点数值小于指针q的下一个结点数值,那么就说明外来链表中的该数比较大,应插入到本体链表比较小数的后面某一位置,此时,就需令指针p指向下一个结点,其他变量不变。并进行下一步循环操作,重新比较和插入。
该循环的循环结束条件是指针p的下一个结点为空或者是指针q的下一个结点为空。
其中,指针p的下一个结点为空说明指针q指向往后的结点数值均大于本体链表结点的数值,此时需要在下一步中判断指针q是否为空,若不为空,则令指针q指向的余下结点整体插入到本体链表尾部,即指针p的下一个结点处;
循环结束的第二个条件,指针q的下一个结点为空说明外来链表的说有元素已经按算法要求插入到了本体链表内,即链表合并成功
算法的C#代码如下:
public void Merges(LinkList lst)
{
Node p = this.head;
Node q = lst.head;
while (p.next != null && q.next != null)
{
if (Convert.ToDecimal(p.next.data) > Convert.ToDecimal(q.next.data))
{
Node t = new Node(q.next.data);
t.next = p.next;
p.next = t;
p = p.next;
q = q.next;
}
else if (Convert.ToDecimal(p.next.data) == Convert.ToDecimal(q.next.data))
q = q.next;
else
p = p.next;
}
if (q.next != null)
p.next = q;
this.length += lst.length;
}