面試100題系列之18鍊錶合併

2021-06-14 02:35:45 字數 1608 閱讀 6724

。碼字也不容易是不?

1、給定兩個有序的鍊錶,假設都是

公升序的。需要合併兩個鍊錶,去除重複的元素,也就是求兩個鍊錶的並,這裡要求合併之後的

結果降序排列。既然有序,那問題就簡單多了。ok,輕鬆加愉快的寫出來**。遍歷兩個鍊錶,如果鍊錶1的元素比鍊錶2的元素小,取鍊錶1的元素;如果大於,則取鍊錶2的元素;如果等於,釋放掉乙個就可以了。好了~哦吼吼~最悲劇的知道是什麼嗎?明明覺得你的**是對的,卻沒人跟你將bug在**,自己依然沾沾自喜。試一下測試用例1->2->3->3->10和1->3->4->8.合併出來居然有兩個3吶。為什麼?因為你沒有考慮鍊錶自身會有重複元素啦~知道錯了吧~

ok,看核心**啦:

//合併兩個公升序鍊錶,並去除重複元素,結果降序排列

void mergeincreaselinktodecrease(node *phead1, node *phead2, node *panshead)

ptemp = phead1->next;

phead1->next = ptemp->next;

} else

ptemp->next = panshead->next;

panshead->next = ptemp;

} //合併剩下的部分,注意這裡合併之後,為降序

while(phead1->next)

//合併剩下的部分

while(phead2->next)

}

2、ok,題目變一下,如果需要合併了之後的鍊錶依然保持公升序排列,ok,一樣的處理,不過在合併剩下的部分的時候,發現什麼不同了麼?

//合併兩個公升序鍊錶,去除重複元素,合併的結果依然儲存公升序

void mergeincreaselinktoincrease(node *phead1, node *phead2, node *panshead)

ptemp = phead1->next;

phead1->next = ptemp->next;

} else

pcur->next = ptemp;

pcur = ptemp;

} pcur->next = null;

//拼接剩下的部分

if(phead1->next)

pcur->next = phead1->next;

if(phead2->next)

pcur->next = phead2->next;

}

#includestruct node

;const int n = 30;

node node[n];

int top;

//建立鍊錶

int creatlink(node *phead)

return 1;

}//列印鍊錶

void print(node *phead)

printf("\n");

}//去除排序鍊錶自身的相同元素

void removesamenum(node *phead)

}int main()

return 0;

}

Leetcode刷題鍊錶之合併有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 由於兩個鍊錶都是有序的,因此相當於固定乙個鍊錶,另乙個鍊錶插入到其中。這裡只要比較兩個鍊錶中節點中值的大小即可。可以先建立乙個新的鍊錶,設定乙...

微軟等面試100題系列 45 2

2.乙個整數陣列,長度為n,將其分為m份,使各份的和相等,求m的最大值 比如 可以分成 m 1 m 2m 3 所以m的最大值為3 package com.interview.algorithm public class leveragesum 可以分成 m 1 m 2m 3 所以m的最大值為3 pu...

面試必考系列 合併兩個有序鍊錶

1 遞迴法 public listnode mergetwolists listnode l1,listnode l2 if l2 null 注意等號別忘了 if l1.val l2.val if l1.val l2.val return null public listnode mergetwol...