合併兩個有序鍊錶

2022-08-09 08:45:09 字數 1449 閱讀 2463

合併兩個有序鍊錶,使得合併後的結果仍然是有序的,直觀的做法就是從兩個鍊錶的首節點開始比較,將其中小的那個鏈結到新鍊錶之中,(如果不想破壞原鍊錶,那麼需要將該節點拷貝乙份,然後鏈結到新鍊錶之中。)然後將該節點對應的原鍊錶的遍歷指標向後移動(p = p->next)一直這樣比較下去,直到其中某個被遍歷完,這時將剩餘的那個鍊錶直接鏈結到新鍊錶後面即可。

當然,對於不帶頭結點的鍊錶而言,需要判斷原鍊錶是否為空。帶上頭結點就可以適當的簡化程式。

具體**實現如下,這裡的實現實在原煉表上操作的,破壞了原鍊錶,所以當你需要不破壞原鍊錶的時候,那麼你應該用malloc來申請一塊記憶體存放原鍊錶的節點。具體實現在此處不表。

#define _crt_secure_no_warnings

#include#include//定義抽象資料型別

typedef int elementtype;

typedef struct node *ptrtonode;

struct node ;

typedef ptrtonode list;

list read(); //構造鍊錶

void print(list l); //遍歷鍊錶

list merge(list l1, list l2); //合併鍊錶

int main()

list read()

temp1->next = null; //鍊錶結尾指向null

return p;

}void print(list l)

while (null != temp) }

list merge(list l1, list l2)

else

}if (null == p1)

if (null == p2)

//此處在原節點的基礎上合併兩個鍊錶,破壞掉了原鍊錶,使得原煉表為空

l1->next = null;

l2->next = null;

//返回新鍊錶的頭指標

return p;

}

這種使用雙指標的方法,不止在合併鍊錶的時候會用到,前面做刪除陣列中重複的元素時候,使用了相同的思路,快速排序也使用了類似的方式。這個雙指標的用法還是很多的。

————————————————————9.16更新,並不華麗的分割線——————————————————

下面是鍊錶相對於陣列的一些特點。

求鍊錶的長度需要遍歷整個鍊錶,而不像陣列一樣只需要返回last+1。

插入和刪除操作如果出現在首節點處,將會迫使我們更改鍊錶的頭指標。這個操作的風險性太大,很容易導致鍊錶的丟失,有個好一點的做法就是像上面那樣,使用乙個空的頭結點。這樣即使你在第乙個有效節點處做了插入,刪除操作,也不會導致頭指標變化。

在單鏈表上插入,刪除乙個節點,必須知道其前驅節點。

線性表是最基本的資料結構,將來樹和圖都將依賴於線性表來實現。(廣義的表結構)

合併兩個有序鍊錶

鍊錶的題目總是讓我很惆悵。動輒就會runtime error。比如這題,額外用了乙個節點的空間來儲存頭節點。我很不情願多用這個空間,不過貌似不行。貌似不行,實際可行,見附錄。把頭節點提出迴圈 實現類 class solution else if l1 null p next l1 if l2 nul...

合併兩個有序鍊錶

三個指標乙個儲存la鍊錶 乙個儲存lb鍊錶,乙個指向新的鍊錶。鍊錶的插入,兩個指標,乙個是head,乙個指向head後面的鏈,新插入的元素位於head後面。執行該 自己外加上class類。static class node public static void main string args st...

合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4思路 很簡單就是二路歸併的思想,時間複雜度o n definition for singly linked list.struct listno...