兩個有序鍊錶的合併

2021-07-29 13:41:35 字數 2572 閱讀 9697

02-線性結構1 兩個有序鍊錶序列的合併   (15分)

本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。

list merge( list l1, list l2 );
其中list結構定義如下:

typedef struct node *ptrtonode;

struct node ;

typedef ptrtonode list; /* 定義單鏈表型別 */

l1l2是給定的帶頭結點的單鏈表,其結點儲存的資料是遞增有序的;函式merge要將l1l2合併為乙個非遞減的整數序列。應直接使用原序列中的結點,返回歸併後的煉表頭指標。

#include #include typedef int elementtype;

typedef struct node *ptrtonode;

struct node ;

typedef ptrtonode list;

list read(); /* 細節在此不表 */

void print( list l ); /* 細節在此不表;空煉表將輸出null */

list merge( list l1, list l2 );

int main()

/* 你的**將被嵌在這裡 */

3

1 3 5

52 4 6 8 10

1 2 3 4 5 6 8 10 

null

null

#include 

#include

typedef int elementtype;

typedef struct node *ptrtonode;

struct node ;

typedef ptrtonode list;

list read(); /* 細節在此不表 */

void print( list l ); /* 細節在此不表;空煉表將輸出null */

list merge( list l1, list l2 );

int main()

/* 你的**將被嵌在這裡 */

list read()

return front;

}void print(list l)

printf("\n");

}list merge( list l1, list l2)

else if(front2==null&&front1!=null)

else

else if (front1->data < front2->data)

else if(front1->data==front2->data)}}

l1 ->next = null;

l2 ->next = null;

return front;

}

錯誤:老師你好 何老師講的辦法我聽明白了就是兩個表比較 最後在把剩下的補到後面去寫了三個迴圈

但當我寫的是 只要兩個表乙個不為空就迴圈 判斷新增

有乙個測試用例過不去 就是 第二個表 完全貼到第乙個表前面去

我測試時這種情況直接就停止工作了。仔細想了想也沒想明白。

list merge( list l1, list l2 )

else if(front2==null||(front1->data < front2->data))

else  if(front1->data==front2->data)

}l1 ->next = null;

l2 ->next = null;

return front;

}樓主昨天突然發現如果把迴圈條件寫為 while(front1||front2)時,   if(front1==null||(front1->data > front2->data))       else if(front2==null||(front1->data < front2->data))  else  if(front1->data==front2->data) 這三個條件是不能這樣寫的,否者就會出現判斷tiaojian裡的棧溢位,(第二個表完全貼在第乙個表的前面時),比如輸入1

211       迴圈一遍後front2=null;front1 不變,rear指向front2原來所在位置即 rear->data = 1;

這時迴圈第二遍if(front1==null||(front1->data > front2->data))   先判斷front1不為kong,

再去看front1->data >      front2->data 是否為真,但這時front2為空然後程式就掛掉了;

經過這道題樓主稍微明白了啥是鍊錶,稍加修改後正確**如下: 分支又多還有**重複耗時是老師講的辦法的六倍(17:3)

樓主也是崩潰的出力不討好,不過樓主也是欣慰的 吃一塹長一智嘛

合併兩個有序鍊錶

鍊錶的題目總是讓我很惆悵。動輒就會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...