C#實現單鏈表合併與去重的算法

僅僅做一次記錄

  1. 兩個非降序單鏈表的去重加合併

代碼實現————注意是直接更改原始鏈表

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();

測試如圖
測試圖片

  1. 非降序鏈表合併排序輸出(遞歸算法:)
    注意————兩個原始鏈表都會被更改爲新鏈表
	 /// <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();

測試如圖
測試圖片

  1. 兩個鏈表首尾合併 不返回新聯表
    注意————此方法直接在鏈表後面追加新鏈表
	   /// <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();


測試如圖
測試圖片

  1. 兩個鏈表首尾合併 返回新鏈表
    注意————此方法不會改變原始鏈表
    此方法不適合封裝在鏈表類內部
		/// <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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章