合併有序鏈式線性表

2021-08-10 23:28:48 字數 2331 閱讀 1676

leetcode的easy題之21merge two sorted lists要求合併兩個已經排好序的鏈式線性表。其實就是簡單的鍊錶操作。

但是由於自己各種操作不熟悉,這道題捯飭了一天。首先就是這個控制台輸入兩組數,分別建立兩個線性表這裡卡了很久。另乙個點就是把鍊錶接起來,這裡操作也不是很熟悉。以下就分這兩個點來總結記錄一下。

要求:兩組數以回車符'\n'作為分隔標記,組內的數以空格作為分隔。

線性表的結構

struct listnode;//這個相當於預設的建構函式

listnode(int x) :val(x), next(null){};

};

方法一:用cin.get()函式

listnode *l1;

int temp;

cin >> temp;

listnode first(temp);

l1 = &first;

listnode *p1 = &first;

while (cin >> temp)

}

這裡要補充說明的是:

1. 緊跟在數字後面的回車符才是有效回車符,要不然如果手賤在某個數字後面加了個空格才回車,這並不退出迴圈。我就一度在這個問題糾結了很久,因為沒有意識到自己加了空格,然後還以為程式出現了奇怪的問題。

2. 如果要用listnode *medal = new listnode的話,需要使用的是listnode(){};建構函式,如果不寫這個會發生錯誤「不存在預設的建構函式 」。如果用題目給的帶引數的建構函式,可以這樣寫listnode *medal = new listnode(temp)。這裡的兩個知識點是:

-new 後面的東西實際上是個建構函式,而不是類的名字;

-當類裡面設定了帶引數的建構函式的時候,系統不再自動生成預設建構函式

方法二:用cin.peek()判斷

char clearbuffer[100];

char c;

listnode *l1;

int temp;

cin >> temp;

listnode first(temp);

l1 = &first;

listnode *p1 = &first;

bool inputend = false;

while (!inputend && cin >> temp)

}}

補充說明:

1.cin.peek()的作用是判斷當前輸入的字元;

2.isspace()函式判斷字元是不是whitespace字元,whitespace字元有很多:

space (0x20, 』 『)

form feed (0x0c, 『\f』)

line feed (0x0a, 『\n』)

carriage return (0x0d, 『\r』)

horizontal tab (0x09, 『\t』)

vertical tab (0x0b, 『\v』)

嚴蔚敏的資料結構課本上用帶頭結點的鍊錶,並且在合併的時候啟用了乙個新的頭結點lc和指向三個鍊錶的指標pa, pb, pc。整體思路是:一開始令lc = la,比較*pa和*pb的值,然後移動相應的指標,一直到la或者lb的列表為空,然後把剩下的繼續插到lc上去。

我自己的思路是沒有用到新的鍊錶,直接將l2插入到l1當中去,所以如果l1比較長的話,可以省去很多複製操作。而且我的鍊錶是沒有頭結點的,只有頭指標。具體實現如下:

(注意處理l1或者l2為空的情況)

listnode* mergelists(listnode *l1, listnode*l2)

else

if (p1==

null)

while (p1 !=

null

&& p2 !=

null)

else

p2->next = p1;

p1_pre = p2;

p2 = p2_temp;

}else

}//這種情況是l2比較長,把l2剩下資料都接到l1連表上

if (p1 ==

null)

return l1;

}

線性表的合併(有序)

define crt secure no warnings 1 include stdio.h include windows.h define maxsize 20 typedef struct a int hblist a b,a c,a d while blow b last clow c l...

線性表的合併 有序表(利用順序表)的合併

例1 求解一般集合的並集問題 問題描述 已知兩個集合 a 和 b 現要求乙個新的集合 a a u b 例如,設 a 7,5,3,11 b 2,6,3 合併後,a 7,5,3,11,2,6 問題分析 可以利用兩個線性表 la 和 lb 分別表示集合 a 和 b 即線性表中的資料元素為集合中的成員 這樣...

有序線性表的有序合併

對於這個問題其實想法很簡單,已經已知線性表是有序的,那麼我們只需要比較值的大小放入另外乙個陣列中或者直接輸出 要考慮的是兩個輸入序列的邊界問題。這個問題在 中注釋,也是常用的迴圈兩個線性表的方法。已知線性表 la 和 lb 中的資料元素按值非遞減有序排列,現要求將 la 和 lb 歸併為乙個新的線性...