僅僅做一次記錄
- 兩個非降序單鏈表的去重加合併
代碼實現————注意是直接更改原始鏈表
public void Merge2(LinkList<T> linkList)
{
Node<T> p = this.Head.Next;
Node<T> q = linkList.Head.Next;
LinkList<T> newlink = new LinkList<T>();
newlink.head = this.head;
Node<T> Newtail = newlink.head;
// Newtail.Next = null;
Node<T> newnode = new Node<T>();
while (p != null && q != null)
{
while (p.Next != null && Convert.ToDecimal(p.Data) == Convert.ToDecimal(p.Next.Data))
{
p = p.Next;
}
while (q.Next != null && Convert.ToDecimal(q.Data) == Convert.ToDecimal(q.Next.Data))
{
q = q.Next;
}
if (Convert.ToDecimal(p.Data) <= Convert.ToDecimal(q.Data))
{
newnode = p;
if (Convert.ToDecimal(p.Data) == Convert.ToDecimal(q.Data))
{
q = q.Next;
}
p = p.Next;
}
else
{
newnode = q;
q = q.Next;
}
// newnode.Next = null;
Newtail.Next = newnode;
Newtail = Newtail.Next;
}
if (p == null)
{
p = q;
}
while (p != null)
{
while (Convert.ToDecimal(Newtail.Data) == Convert.ToDecimal(p.Data))
{
p = p.Next;
}
Newtail.Next = p;
Newtail = Newtail.Next;
p = p.Next;
}
}
//主方法調用
LinkList<string> linkList1 = new LinkList<string>();
linkList1.Input();
LinkList<string> linkList2 = new LinkList<string>();
linkList2.Input();
Console.WriteLine("原始鏈表1:");
linkList1.Display();
Console.WriteLine("原始鏈表2:");
linkList2.Display();
Console.WriteLine("兩個非降序鏈表合併去重");
linkList1.Merge2(linkList2);
Console.WriteLine("合併去重後的鏈表");
linkList1.Display();
Console.WriteLine("原始鏈表1:");
linkList1.Display();
Console.WriteLine("原始鏈表2:");
linkList2.Display();
Console.Read();
測試如圖
- 非降序鏈表合併排序輸出(遞歸算法:)
注意————兩個原始鏈表都會被更改爲新鏈表
/// <summary>
/// 非降序鏈表合併排序輸出(遞歸算法:)兩個原始鏈表都會被更改
/// </summary>
/// <param name="l1">鏈表1的頭節點</param>
/// <param name="l2">鏈表2的頭節點</param>
/// <returns></returns>
public Node<T> Merge(Node<T> list1, Node<T> list2)
{
if (list1 == null)
{
return list2;
}
if (list2 == null)
{
return list1;
}
if (Convert.ToDecimal(list1.Data) <= Convert.ToDecimal(list2.Data))
{
list1.Next = Merge(list1.Next, list2);
return list1;
}
else
{
list2.Next = Merge(list1, list2.Next);
return list2;
}
}
//方法調用
LinkList<string> h = new LinkList<string>();
Node<string> a = linkList1.Merge(linkList1.Head, linkList2.Head);
h.Head = a.Next;
Console.WriteLine("非降序鏈表合併排序輸出(遞歸算法:)");
h.Display();
Console.WriteLine("原始鏈表1:");
linkList1.Display();
Console.WriteLine("原始鏈表2:");
linkList2.Display();
Console.Read();
測試如圖
- 兩個鏈表首尾合併 不返回新聯表
注意————此方法直接在鏈表後面追加新鏈表
/// <summary>
/// 兩個非降序鏈表合併 有重複項 直接更改鏈表1
/// </summary>
/// <param name="linkList">需要合併的鏈表</param>
public void Merge1(LinkList<T> linkList)
{
if (linkList.head == null)
{
return;
}
Node<T> A = this.head.Next;
Node<T> B = linkList.head.Next;
while (A.Next != null)
{
A = A.Next;
}
A.Next = B;
}
//方法調用
Console.WriteLine("兩個鏈表首尾合併,會改變原始鏈表");
linkList1.Merge1(linkList2);
Console.WriteLine("合併後的鏈表:");
linkList1.Display();
Console.WriteLine("原始鏈表1:");
linkList1.Display();
Console.WriteLine("原始鏈表2:");
linkList2.Display();
Console,Read();
測試如圖
- 兩個鏈表首尾合併 返回新鏈表
注意————此方法不會改變原始鏈表
此方法不適合封裝在鏈表類內部
/// <summary>
/// 不更改鏈表 兩個鏈表首尾合併返回新鏈表
/// </summary>
/// <param name="La"></param>
/// <param name="Lb"></param>
/// <returns></returns>
public static LinkList<string> Merge123(LinkList<string> La, LinkList<string> Lb)
{
LinkList<string> ret = new LinkList<string>();
Node<string> p = La.Head.Next;
while (p != null)
{
ret.Append(p.Data);
p = p.Next;
}
p = ret.Head;
while (p.Next != null)
{
p = p.Next;
}
p.Next = Lb.Head.Next;
return ret;
}
//方法調用
Console.WriteLine("兩個鏈表首尾合併,不改變原始鏈表");
LinkList<string> test1 = Merge123(linkList1, linkList2);
Console.WriteLine("合併後的新鏈表:");
test1.Display();
Console.WriteLine("原始鏈表1:");
linkList1.Display();
Console.WriteLine("原始鏈表2:");
linkList2.Display();
Console.Read();
測試如圖
學而時習之 不亦說乎!
注意算法題 畫圖會更好理解一點 有大佬會兩個非降序單鏈表的去重加合併 比第一個代碼更好理解的請留言
遞歸算法 來源於LeetCode的一道題目 有興趣的去了解下
代碼文件已上傳GitHub