1. 程式人生 > >【資料結構】合併兩個有序連結串列,合併後依然有序

【資料結構】合併兩個有序連結串列,合併後依然有序

//遞迴
pList Merge(pList list1, pList list2)
{
	pList newlist = NULL;
	if (NULL == list1)
	{
		return list2;
	}
	if (NULL == list2)
	{
		return list1;
	}
	if (NULL == list1 &&  NULL == list2)
	{
		return NULL;
	}
	if ((list1)->data == (list2)->data)
	{
		newlist = list1;
		newlist->next = Merge_R((list1)->next, (list2)->next);
	}
	if ((list1)->data < (list2)->data)
	{
		newlist = list1;
		newlist->next = Merge_R((list1)->next, list2);
	}
	if ((list1)->data >(list2)->data)
	{
		newlist = list2;
		newlist->next = Merge_R(list1, (list2)->next);
	}
	while (list1)
	{
		list1 = (list1)->next;
	}
	while (list2)
	{
		list2 = (list2)->next;
	}
	return newlist;
}

//非遞迴
pList Merge_R(pList list1, pList list2)
{
	pList newlist = NULL;
	pNode cur = NULL;
	if (list1 == NULL)
		newlist = list2;
	if (list2 == NULL)
		newlist = list1;
if (NULL == list1 &&  NULL == list2)
	{
		return NULL;
	}
	if (list1->data == list2->data)
	{
		cur = BuyNode(list1->data);
		list2 = list2->next;
		list1 = list1->next;
		newlist = cur;
	}
	else if (list1->data > list2->data)
	{
		cur = BuyNode(list2->data);
		list2 = list2->next;
		newlist = cur;
	}
	else  if (list1->data < list2->data)
	{
		cur = BuyNode(list1->data);
		list1 = list1->next;
		newlist = cur;
	}
	while (list1&&list2)
	{
		if (list1->data >= list2->data)
		{
			cur->next = BuyNode(list2->data);
			list2 = list2->next;
			cur = cur->next;
		}
		else if (list1->data < list2->data)
		{
			cur->next = BuyNode(list1->data);
			list1 = list1->next;
			cur = cur->next;
		}
	}
	while (list1)
	{
		cur->next = BuyNode(list1->data);
		list1 = list1->next;
		cur = cur->next;
	}
	while (list2)
	{
		cur->next = BuyNode(list2->data);
		list2 = list2->next;
		cur = cur->next;
	}
	return newlist;

}

相關推薦

資料結構帶有尾指標的連結串列連結串列實現佇列

前面寫了用動態陣列實現佇列,現在我將用帶有尾指標的連結串列實現佇列。 我們知道佇列需要在兩端進行操作,如果是以普通連結串列進行底層實現的佇列,在入隊時需要找到最後一個節點才能進行新增元素,這樣相當於遍歷一遍連結串列,從而造成巨大的時間浪費。 為了解決這個問題,我們引入了尾

資料結構雙向帶頭結點迴圈連結串列

在之前我們寫了不帶頭結點的單鏈表,但它在資料操作時也有繁瑣之處,而雙向帶頭結點迴圈連結串列則優化了單鏈表的操作,使連結串列更加方便。雙向帶頭結點迴圈連結串列在單鏈表的基礎上增加了以下幾點: (1)在資料結構上附加一個域,使它存放指向前一個結點的指標; (2)增加了一個頭結點,前驅指向連結串列

資料結構-線性表-順序表-1324: 演算法2-2:有序線性表的有序合併

1324: 演算法2-2:有序線性表的有序合併 題目描述 已知線性表 LA 和 LB 中的資料元素按值非遞減有序排列,現要求將 LA 和 LB 歸併為一個新的線性表 LC, 且 LC 中的資料元素仍然按值非遞減有序排列。例如,設LA=(3,5,8,11)

資料結構中的順序表的合併

#include <iostream> #include<stdlib.h> using namespace std; #define  MAXSIZE 100   #define TRUE 1 #define FALSE 0 #define OK 1

C++資料結構模版類實現雙迴圈連結串列的基本操作

單鏈表結構為我們提供方便分資料插入和刪除工作,美中不足的是查詢資料不方便,對於單鏈表查詢資料至少要遍歷一邊.  為此我們提出雙鏈表結構,從而方便的查詢資料. 給出雙鏈表的一般結構: 一種是帶頭結點(哨兵位)的管理方式,另一種是帶管理節點管理方式。 但是我們不建議採用

劍指 Offer - 16:合併排序連結串列

題目描述 輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則 題目連結:https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337

Lintcode 165. 合併排序連結串列

我的程式碼如下: def mergeTwoLists(self, l1, l2): if l1 == None: return l2 if l2 == None: return l1

LinCode 165.合併排序連結串列

思路 兩個指標,分別指向兩個連結串列,從頭開始遍歷 另一個指標指向新建立的節點,將排序好的節點串聯起來 注意此題是允許重複元素的 /** * Definition of singly-linked-list: * class ListNode { * p

C++將遞增連結串列 合併成 一個遞增連結串列 不佔用額外的空間

/*create by tyy*/ #include <iostream> #include <string> using namespace std; #define ok 1 #define error -1 #define overflow -

合併排序連結串列

public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { if(list1 == null){ return list2; }

合併排序連結串列(LintCode)

實現程式碼:#include <iostream> using namespace std; //Definition of ListNode class ListNode { public: int val; ListNode *next; ListNode(int

[劍指Offer] 25_合併排序連結串列

題目 輸入兩個遞增排序的連結串列,合併這兩個連結串列並使新連結串列中的節點仍然使遞增排序的。 例: L1:1->3->5->7 L2:2->4->6->8 L:1->2->3->4->5->6->

Lintcode 165合併排序連結串列

1.問題描述:將兩個排序連結串列合併為一個新的排序連結串列 2.解題思路:遍歷兩個連結串列的公共長度,根據節點值得大小來改變每次節點的連線,然後判斷那條連結串列還有剩餘,最後將較長連結串列的剩餘部分追加到節點的後面 3.通過的程式碼: /**  * Definition o

面試雜題(八)合併遞增連結串列

#include <iostream> typedef struct LinklistNode { int nData; struct LinklistNode *next; }Node; using namespace std; #define N

LintCode-合併排序連結串列

題目描述:將兩個排序連結串列合併為一個新的排序連結串列 樣例 給出1->3->8->11->15->null,2->null,返回1->2->3->8->11->15->null。 做題思路:用兩個頭

劍指offer面試題17-:合併排序連結串列

將兩個已經排好序的連結串列(升序)進行合併,使得合併後的連結串列仍然有序。 假設兩個連結串列分別為A和B,我的思路是將使用兩個指標p和q掃描兩個連結串列各一遍,將B連結串列中的元素插入到A中,最終形成一個新的連結串列。 邊界條件:(1)連結串列為空時;          

資料結構合併有序連結串列

#include<stdio.h> #include<string.h> #include<stdlib.h> const int maxn = 1e5 + 5; struct node { int num; struct node *next; }; s

資料結構合併有序連結串列,合併依然有序

//遞迴 pList Merge(pList list1, pList list2) { pList newlist = NULL; if (NULL == list1) { return list2; } if (NULL == list2)

資料結構連結串列相關練習題:判斷連結串列是否相交

編寫一個程式,找到兩個單鏈表相交的起始節點。 例如,下面的兩個連結串列: A: a1 → a2 ↘ c1 → c2 → c3 ↗

c語言資料結構有序連結串列合併為一個新連結串列

先建立兩個連結串列La和Lb,並向La Lb中輸入值,然後再建立一個Lc,Lc指向La,具體程式碼如下: #include "stdafx.h" #include"stdio.h" #include"stdlib.h" #define OK 1 #define OVERFL