1. 程式人生 > >合併兩個有序連結串列,合併之後依舊有序

合併兩個有序連結串列,合併之後依舊有序

解法一   使用遞迴

struct list_node
{
	int data;
	list_node* next;

	list_node(int data)
		:data(data)
		, next(NULL)
	{}
};

//  1  遞迴法   

list_node* R_mergc(list_node* l1, list_node* l2)
{
	if (l1 == NULL)
	{
		return l2;
	}
	else if (l2 == NULL)
	{
		return l1;
	}


	//下邊的要注意返回值
	//方法一
	/*if (l1->data < l2->data)
	{
		l1->next = R_mergc(l1->next, l2);
		return l1;
	}
	else
	{
		l2->next = R_mergc(l2->next, l1);
		return l2;
	}*/

	//方法二
	list_node* tmp = NULL;
	if (l1->data < l2->data)
	{
		tmp = l1;
		tmp->next = R_mergc(tmp->next, l2);
	}
	else
	{
		tmp = l2;
		tmp->next = R_mergc(tmp->next, l1);
	}
	return tmp;
}



解法二  

struct list_node
{
	int data;
	list_node* next;

	list_node(int data)
		:data(data)
		, next(NULL)
	{}
};

//  2 非遞迴

list_node* mergc(list_node* l1, list_node* l2)
{
	if (NULL == l1)
	{
		return l2;
	}
	else if (NULL == l2)
	{
		return l1;
	}
	list_node* head = NULL;  //用作返回的頭結點
	list_node* p1 = l1;  //用作 l1 的零時變數
	list_node* p2 = l2;	 //用作 l2 的零時變數

	if (p1->data < p2->data)
	{
		head = p1;
		p1 = p1->next;
	}
	else
	{
		head = p2;
		p2 = p2->next;
	}

	list_node* cur = head;  //

	while (p1 && p2)
	{
		if (p1->data < p2->data)
		{
			cur->next = p1;
			cur = cur->next;
			p1 = p1->next;
		}
		else
		{
			cur->next = p2;
			cur = cur->next;
			p2 = p2->next;
		}
	}

	if (p1 != NULL)
	{
		cur->next = p1;
	}
	else
	{
		cur->next = p2;
	}
	return head;
}


相關推薦

輸入遞增連結串列合併為一個遞增連結串列(面試題)

輸入兩個遞增連結串列,合併為一個遞增連結串列。 public class LinkedTest { public static void main(String[] args) {

合併有序連結串列合併之後有序

合併兩個有序連結串列,合併之後仍有序。 標頭檔案引用連結串列的一些基本操作 ListNode * MergeOrderedList(ListNode *List1,ListNode *List2) { ListNode *cur1 = List1; ListNode *cur2

合併有序連結串列合併後依然有序

pNode MergeSList(pList plist1, pList plist2) { pNode pNewHead = NULL;//新連結串列 pNode pTail = NULL;//新連結串列的尾指標 pNode pL1 = plist1; pNode

合併有序連結串列合併之後任然是有序的並輸出。

合併連結串列相信大家都特別熟悉,但是如果要加上一定的輸出格式,難度就會有所增加,不說了,見程式碼。 #include<iostream> using namespace std; struct Node{ Node *next; int data

合併有序連結串列合併後依然有序 --- 三種方法

1.合併連結串列p1,p2到p1上 void CombineList(ListNode** p1,ListNode* p2)//合併連結串列p1,p2 到p1 { if (*p1 == NULL) { *p1 = p2;

合併有序連結串列合併之後依舊有序

解法一   使用遞迴 struct list_node { int data; list_node* next; list_node(int data) :data(data) , n

劍指 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

合併排序連結串列

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)連結串列為空時;          

Python-劍指offer(15,16)反轉連結串列合併連結串列

題目:輸入一個連結串列,反轉連結串列後,輸出新連結串列的表頭。 環境:Python2.7.3 # -*- coding:utf-8 -*- # class ListNode: # def _

有序連結串列合併

二、實驗分析(1)問題分析1、考慮兩個連結串列L1,L2中資料的多少;2、用兩個指標同時遍歷兩個有序連結串列L1,L2,並且比較每次讀取的兩個連結串列元素的數值,將其中的小值插入到新的連結串列L中。3、考慮到其中連結串列L1(或者L2)由於元素少,而被先遍歷完,另個連結串列L

21. 合併有序連結串列/23. 合併K排序連結串列

1.合併兩個有序連結串列 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* Phead = new ListNode(0); ListNode* l3 = Phead; while

PTA資料結構題程式設計題7-51 有序連結串列序列合併

已知兩個非降序連結串列序列S1與S2,設計函式構造出S1與S2合併後的新的非降序連結串列S3。輸入格式:輸入分兩行,分別在每行給出由若干個正整數構成的非降序序列,用−表示序列的結尾(−不屬於這個序列)。數字用空格間隔。輸出格式:在一行中輸出合併後新的非降序連結串列,數字間用空